0

RSpec と FactoryGirl を実行している間、任意のパラメーターを自動的に fixnum に変換しますが:id、実際には文字列として渡されます。私が持っているコードは:id、複合主キーとして split を呼び出そうとするプロセスを持っていますparams[:id]。その結果、次のように例外が発生します。

NoMethodError:
    undefined method 'split' for 234:Fixnum

このようなものを呼び出そうとすると:

  @myinstance = MyClass.find(params[:id].split("-").map{|x| x.to_i})

この問題を回避するために、単純な型チェックを追加しました。

if params[:id].is_a? Fixnum
  @myinstance = MyClass.find(params[:id])
else
  @myinstance = MyClass.find(params[:id].split("-").map{|x| x.to_i})
end

しかし、これは私が期待するようには機能しません。ifステートメントは に評価され、falsesplitまだ試行されているため、同じエラーが発生します。params[:id]Rubyが " " ロジックで Fixnum として認識しているにもかかわらず、ステートメントでのelse評価に失敗する可能性はありますか?trueif

4

1 に答える 1

3

それは全くの論理です:params[:id]Stringまたはnil.

ああ...答えを編集する必要があります:

コントローラーのスペックを行うと、送信するパラメーターが送信されas-is、文字列化されません...これは面倒ですが、遅かれ早かれ修正する必要があります。

したがって、仕様では、パラメータを文字列化して現実に近づけてください。

これは非常に重要な点です。コードを仕様に合わせてはいけません。その逆を行ってください。

于 2012-05-21T19:54:41.170 に答える