2017-02-20 8 views
0

は、だから私は協会のこの種類があります。Rails。 HAS_MANY:通って、チェックボックスフィールドのためのform_forのparams

class FirstModel 
has_many :merged_models 
has_many :second_models, :through => :merged_models 
end 

class SecondModel 
has_many :merged_models 
has_many :first_models, :through => :merged_models 
end 

class MergedModel 
belongs_to :first_model 
belongs_to :second_model 
end 

を今私の問題は私に渡されたコレクションからHTMLの要素を認識するヘルパーを助け、このトリックを理解することです形式:

form_for(first_model) do |f| 

    <% SecondModel.all.each do |s| -%> 
    <div> 
     <%= check_box_tag 'second_model_ids[]', s.id, first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]'-%> 
     <%= label_tag :second_model_ids, s.first_name -%> 
    </div> 
    <% end -%> 

私は理解していないことはこれです:

first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]' 

first_model.second_models.include?(s) 

チェックSecondModelのオブジェクトIDがFirstModelのsecond_model_ids配列中の場合:私は、これがあると信じています。

その :nameから来た
:name => 'first_model[second_model_ids][]' 

:?このIDは、その後など

、ということが行うされており、この部分は、私はさらに混乱して行う場合 - この場合、私は、if文のようなものを期待しますかなぜfirst_model[second_model_ids][]に2つの角括弧があるのですか?それらはRails構文でどのように機能しますか?これを新しくチェックしたIDをsecond_model_ids配列にマージするには?

私はすべての情報をいただければ幸いです。ありがとう!あなたのケースで

check_box_tag(name, value = "1", checked = false, options = {}) 

check_box_tag 'second_model_ids[]', s.id, first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]' 

最初のパラメータ(名前)が 'second_model_idsは[]' は、これはID =一部として使用されている

答えて

1

そこでcheck_box_tagこの署名を有しますタグの チェックボックスの2番目のパラメータ(値)は、sのID(SecondModelの現在のインスタンス)です。 三番目のパラメータ(チェック)は、次のとおりです。

first_model.second_models.include?(s) 

あなたが意味について正しい、とあなたは「場合」を必要としません。インクルード?()はブール値を返します(ほとんどのRubyメソッドは疑問符で終わります)。あなたは、IRBまたはレールコンソールでこれを試すことができます。

[1,2,3].include?(2) 
# => true 

最後のオプション:htmlとして使用されるオプションのハッシュで

:name => 'first_model[second_model_ids][]' 

パスを。この場合、キー:name(上記の最初のパラメータと混同しないでください。これはhtmlタグのid = '...'として使用されています)を持つ単一のハッシュ値です。これはタグ内で直接使用されます。

name='first_model[second_model_ids][]' 

あなたはここでも構文について正しいです。角括弧は、これをparamsハッシュの正しいネストに解析するのに役立ちます。

first_model: {foo: 1, bar: 2, second_model: {some: stuff, other: stuff}}