を表示ファイルから私は、URLに属性を渡す:テストURLに属性を渡す - RSPEC /アドレス可能な宝石
%= link_to piece_path(@current_piece, file: file, rank: rank), method: :patch do %>
これは私がファイルの値を抽出する必要がhttp://localhost:3030/pieces/%23?file=8&rank=8
のようなURLを提供しますこのURLからランク付けして、データベースフィールド(移動後のチェスの座標)を更新します。
私はアドレス可能な宝石を使用しようとしているコントローラで:
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
を検査するとき、私は得る:#<Addressable::URI:0x3fa7f21cc01c URI:http://test.host/pieces/2>
URL後続の属性の何のハッシュはありません。従ってuri.query_values
はnil
を返します。私は知らないどのようにテストでそのようなものをミラーする。
エラーメッセージ:Controller_specで
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
:
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
ロジックは、現時点では(私が作品を持っていないローカルホストブラウザから作品のオブジェクトかどうかは確認することができないので、私はエラーに遭遇する)。それにも取り組んでいます。
私の質問はテストに関するものです。しかし、URLからさまざまな方法で属性を抽出する提案がある場合、私はすべての耳です!
あなたは@current_piece」「あなたはリテラル文字列を '渡すと、@のcurrent_piece''」'周りの引用符を削除する必要があります' - インスタンス変数の値ではありません。 – max
いいキャッチ!実際に私は実際のビューファイルに引用符をつけていませんが、これを間違ったものから貼り付けています(これをプレースホルダとして使用して、オブジェクトを持たないためルーティングエラーをなくします)。 –
私の質問を修正しました。 this –