2017-02-20 4 views
0

Так у меня есть такая ассоциация:Рельсы. HAS_MANY: через и form_for PARAMS для поля CheckBox

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 уже находится в second_model_ids массиве FirstModel в. В этом случае я бы ожидать что-то подобное, если заявление - если этот идентификатор есть то же, что и т.д.

И эта часть делает меня еще более запутанным:

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

Где что :name пришел? Почему у first_model[second_model_ids][] есть две квадратные скобки - как они работают в синтаксисе Rails? Слить этот вновь проверенный идентификатор с массивом second_model_ids?

Буду признателен за всю информацию. Благодаря!

ответ

1

Так check_box_tag есть эта подпись:

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 []', это будет использоваться в качестве идентификатора = часть тега. Второй параметр (значение) этого флажка - это идентификатор s (текущий экземпляр SecondModel). Третий параметр (проверено) является:

first_model.second_models.include?(s) 

Вы правы насчет смысла, и вам не нужен «если». Функция include?() Возвращает логическое значение (например, большинство методов Ruby, которые заканчиваются знаком вопроса). Вы можете попробовать это в IRB или рельсы консоли:

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

Окончательный вариант:

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

переходит в хэш опций, которые будут использоваться в качестве HTML. В этом случае одно значение хэша с ключом: name (не следует путать с первым параметром выше, который использовался как id = '...' в теге html), это будет использоваться непосредственно в теге как

name='first_model[second_model_ids][]' 

Вы также были правы относительно синтаксиса. Скобки помогают Rails анализировать это в правильное гнездование хэша параметров с

first_model: {foo: 1, bar: 2, second_model: {some: stuff, other: stuff}} 
Смежные вопросы