Railsの構文POSTパラメータをフォームからコントローラに渡す

私はRailsに慣れていません(一般的にはプログラミングにはあまり新しい)、私は自分自身のためにウェブアプリケーションを構築して学びます。今、私は足場のフォームなどを変更しています。

私の質問は、私のコントローラの1つで "create"メソッドを使うことです。私が関心を持つ2つのエンティティ、UserテーブルとHabitテーブルがあります。私は、以下のように習慣を作成するときに、利用可能なすべてのリストからユーザーを選択できるように、習慣ビューの_form部分にドロップダウンボックスを作成しました

<%= collection_select  :user, :id, @users, :id, :first_name %>

もちろん、癖コントローラには

def new
  @users = User.all
  ...    
end

これはうまく動作し、フォームが提出すると、habitと:userという2つのパラメータのハッシュが投稿されます。今、createメソッドでフォーム入力を処理したいとき、構文を正しく使い、新しく作成する習慣にuser_idを割り当てる方法がわかりません。私がしたいことは、このようなものです

def create
   @habit = Habit.new(params[:habit], params[:user])
end

これはもちろん、不適切な構文です。

def create
   @habit = Habit.new(params[:habit])
end

:habitハッシュからparamsを正しく割り当てますが、user_idは設定されません。

動作するものは次のとおりですが、コードは非常に長く、各値を手動で割り当てます。

def create
    @habit = Habit.new(:user_id => params[:user][:id], 
                   :description => params[:habit][:description], 
                   :habit_method => params[:habit][:habit_method], 
                  :time_reqd => params[:habit][:time_reqd],
                  :will_reqd => params[:habit][:will_reqd],
                  :active => params[:habit][:active])

end

だから私の質問は、複数のハッシュでデータをポストするフォームを扱うとき、コントローラーのいくつかのメソッドにそれらのパラメーターを渡す適切な方法は何ですか?

1

2 答え

私の質問は、複数のハッシュでデータをポストするフォームを扱うとき、コントローラーのいくつかのメソッドにこれらのパラメーターを渡す適切な方法は何でしょうか?

Instead of saying Habit.new( ), just use Habit.new(params[:habit]). Rails will try to assign each key in the hash (in this case, the params[:habit] hash's keys) to a matching value on the object.

したがって、params [:habit]に:description キーがある場合、モデルの description というフィールドに割り当てられます。これは質量割り当てと呼ばれ、非常に便利です。

今すぐできることは次のとおりです:

@habit = Habit.new(params[:habit])
@habit.user_id = params[:user][:id]

RoRスタートガイド >同様の便利なRailsの機能については、このセクション

2
追加された
いいえ。 @habit = params [:user] は、 params [:user] オブジェクト(ハッシュ)のコピーを作成するので、習慣にそれを入れてください。ただし、 @ habit.attributes = を実行することはできます。
追加された 著者 John Feminella,
ああ、大丈夫。そのため、マスの割り当てはちょっとしたものです。それは理にかなっている。構文のもう1つの質問::ユーザーハッシュに複数のキーがある場合(前の例では1つしかない)、このマスはそのハッシュを @habit = params [:user] に割り当てますか?つまり、既存のオブジェクトに対して質量割り当てを使用できますか?助けてくれてありがとう!
追加された 著者 bknoles,

変化する

<%= collection_select  :user, :id, @users, :id, :first_name %>

<%= collection_select  :habit, :user_id, @users, :id, :first_name %>

既存のスキャフォールドコードはそれ以降はうまくいくはずです

代わりの

<%= f.select :user_id, @users, :id, :first_name %>
0
追加された
ありがとう!これらの例は、私がselect、collection selectなどの議論を理解するのに役立ちます。
追加された 著者 bknoles,