从视图文件中,我在 url 中传递属性:
%= link_to piece_path(@current_piece, file: file, rank: rank), method: :patch do %>
这给出了类似的网址http://localhost:3030/pieces/%23?file=8&rank=8
我需要从此 url 中提取文件的值和排名,以更新数据库字段(移动后棋子的坐标)。
在控制器中,我正在尝试使用 Addressable gem:
def update
(some code)
current_piece.update_attributes(piece_params)
(more code)
end
private
def piece_params
uri = Addressable::URI.parse(request.original_url)
file = uri.query_values.first ## I don't know if "first"
rank = uri.query_values.last ## and "last" methods will work
params.require(:piece).permit({:file => file, :rank => rank})
end
当我检查时,uri
我得到:url 后面没有属性#<Addressable::URI:0x3fa7f21cc01c URI:http://test.host/pieces/2>
散列。从而返回。我不知道如何在测试中反映这样的事情。uri.query_values
nil
错误信息:
1) PiecesController pieces#update should update the file and rank of the chess piece when moved
Failure/Error: file = uri.query_values.first
NoMethodError:
undefined method `first' for nil:NilClass
在 Controller_spec 中:
describe "pieces#update" do
it "should update the file and rank of the chess piece when moved" do
piece = FactoryGirl.create(:piece)
sign_in piece.user
patch :update, params: { id: piece.id, piece: { file: 3, rank: 3}}
piece.reload
expect(piece.file).to eq 3
expect(piece.rank).to eq 3
end
我无法从 localhost 浏览器检查逻辑是否有效(我目前没有碎片对象,所以我遇到了错误)。也在为此努力。
我的问题是关于考试的;但是,如果有建议以不同的方式从 url 中提取属性,我会全力以赴!