Несколько текстовых полей в одном fields_for

Я создаю приложение для управления проектами, и я создаю проект с form_for, но внутри него я хочу, чтобы fields for создал 3 студентов.

Я настроил свой new.html.erb для проектов следующим образом:

<h1>Creating new project</h1>

<%= form_for :project, url: projects_path do |f| %>
  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>

  <p>
    <%= f.label :lecturer %>
    <%= f.text_field :lecturer %>
  </p>

    <p>
        <%= f.fields_for :students do |s| %>
            <%= s.label :name %>
            <%= s.text_field :name %><br>
            <%= s.label :name %>
            <%= s.text_field :name %><br>
            <%= s.label :name %>
            <%= s.text_field :name %>
        <% end %>
    </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

И для метода create просто добавили одну простую строку, чтобы увидеть мой результат form_for:

  def create
    render text: params[:project].inspect
  end

Итак, когда я заполняю текстовые поля на странице и нажимаю «Отправить», все, что я получаю, это {"name"=>"asd", "lecturer"=>"ffff", "students"=>{"name"=>"qeew"}}, так что, как вы можете видеть, только мой последний студент был передан в этот словарь.

Как я могу создать несколько учеников в одном fields_for? Или как я могу настроить эти две модели для работы друг с другом. Надеюсь, вы поняли мою точку зрения и знаете, чего я хочу добиться.


person cojoj    schedule 11.12.2013    source источник


Ответы (2)


Вы можете создать количество студентов, для которых вам нужно иметь поля в вашем контроллере new, следующим образом:

# app/controllers/projects_controller.rb

def new
  @project = Project.new
  3.times do 
    student = @project.students.build
  end
end

Это создаст трех студентов в рамках экземпляра проекта.

Затем обновите объявление form_for вашего представления следующим образом:

# app/views/projects/new.html.erb

<%= form_for @project, url: projects_path do |f| %> 
  <p>
    <%= f.label :name %>
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :lecturer %>
    <%= f.text_field :lecturer %>
  </p>
  <p>
    <%= f.fields_for :students do |s| %>
      <%= s.label :name %>
      <%= s.text_field :name %>
    <% end %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>
person vee    schedule 11.12.2013
comment
Без вопросов. Я редактировал его через свой мобильный телефон, поэтому подсветка синтаксиса не была настроена должным образом. Я вижу, вы снова отредактировали его :-) - person Rohit; 12.12.2013

Вероятно, проще всего было бы передать правильный объект Project вместо того, чтобы инициализировать его из символа. Затем добавьте к объекту трех студентов и сделайте поля для всей коллекции.

Для этого вам понадобится такой код в projects#new -

@project = Project.new
3.times { @project << Student.new }

Затем в форме:

form_for @project do |f|
  ...
  f.fields_for :students do |s|
    s.label :name
    s.text_field :name
  end
end

fields_for автоматически создаст отдельные поля для каждого ученика, которого вы добавили в проект в контроллере.


В одном я не совсем уверен: думаю, вам потребуется добавить строку accepts_nested_attibutes_for :students в модель Project, но я не совсем уверен. У этого есть дополнительное преимущество, заключающееся в том, что вы можете довольно легко создать учащихся и проект в действии создания в контроллере, но это не правильный выбор в каждой ситуации. Если кажется, что мое решение требует accepted_nested_attributes_for, а вы этого не хотите, дайте мне знать, и я могу обновить свой ответ аналогичным, хотя и более болезненным решением.

person Bubbles    schedule 11.12.2013