Рельсы с вложенной формой
Когда я отправляю форму, он создает нового Outfitter, но не создает нового пользователя. В журнале написано "Неразрешенные параметры: utf8, authenticity_token, first_name, last_name, email, пароль, password_confirmation, commit"
Модальный html:(модальный находится в application.html.erb. Страница является localhost: 3000 / pages / index)
<div id="popup-outfitter-signup" class="modal popup">
<div class="modal-main rounded-10px">
<div class="modal-title">
Create your Outfitter<br/>
</div><!-- end .modal-title -->
<%= simple_form_for :outfitter do |f| %>
<div class="modal-message">
<p>
<%= label_tag :name, "Outfitter Name" %><br/>
<%= text_field_tag :name, params[:name], class: 'input-txt rounded-2px' %>
</p>
<p>
<%= label_tag :address, "Address:" %><br/>
<%= text_field_tag :address, params[:address], class: 'input-txt rounded-2px' %>
</p>
<p>
<%= label_tag :business_phone, "Phone:" %><br/>
<%= text_field_tag :business_phone, params[:business_phone], class: 'input-txt rounded-2px' %>
</p>
<%= simple_fields_for :users do %>
<p>
<%= label_tag :first_name, "First Name" %><br/>
<%= text_field_tag :first_name, params[:first_name], class: 'input-txt rounded-2px' %>
</p>
<p>
<%= label_tag :last_name, "Last Name:" %><br/>
<%= text_field_tag :last_name, params[:last_name], class: 'input-txt rounded-2px' %>
</p>
<p>
<%= label_tag :email, "Email:" %><br/>
<%= text_field_tag :email, params[:email], class: 'input-txt rounded-2px' %>
</p>
<p>
<%= label_tag :password, "Password:" %><br/>
<%= password_field_tag :password, params[:password], class: 'input-txt rounded-2px' %>
</p>
<p>
<%= label_tag :password_confirmation, "Password Confirmation:" %><br/>
<%= password_field_tag :password_confirmation, params[:password_confirmation], class: 'input-txt rounded-2px' %>
</p>
<% end %>
<div class="button rounded-2px trans-all">
<%= submit_tag "Signup", class: 'send-btn rounded-2px trans-all' %>
</div>
<br/>
</div>
<% end %>
</div><!-- end .modal-main -->
</div><!-- end .modal -->
outfitters_controller.rb
def new
@outfitter = Outfitter.new
@outfitter.users.build
end
1 ответ
Во-первых, я бы порекомендовал использовать rails form_for или simple_form gem, если вы создаете форму, которая сопоставляется с моделью.
Использование любого из вышеперечисленного позволит вам использовать fields_for: users, который будет отправлять users_attributes контроллеру.
Вам также необходимо принять accept_nested_attributes_for: users в вашей модели Outfitter ( http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html).
Один дополнительный шаг, который будет отличаться, если вы используете Rails 3 или Rails 4:
Rails 4: вам нужно разрешить users_attributes для ваших сильных параметров ( http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html)
params.require(:outfitter).permit(users_attributes: [])
Rails 3: Вы должны добавить:users_attributes к attr_accessible вашей модели
class Outfitter < ActiveRecord::Base
attr_accessible :users_attributes
accepts_nested_attributes_for :users_attributes
...
end
Надеюсь, это поможет вам.
Изменить 1 на основе обновленного вопроса
При использовании простой формы вам нужно передать экземпляр некоторого класса, чтобы он мог построить for для этого конкретного класса и передать переменную формы в блок:
# @outfitter will be the one you instantiated your new action
<%= simple_form_for @outfitter do |f| %>
#form inputs go here, see next code block for more info
<% end %>
Простая форма примет ваш @outfitter
Например, проверьте, сохранена ли запись в базе данных или нет, и определите URL-адрес и метод, по которым for отправит данные при отправке на основании этого.
если
@outfitter
это новая запись (это ваш случай)- URL формы будет указывать на '/outfitters'
- метод будет POST
- это отправит запрос
OutfittersController
создать действие
если
@outfitter
не новая запись (была сохранена в базе данных и теперь обновляется)- URL-адрес формы будет указывать на '/outfitter/:id(идентификатор записи @outfitter, переданной в качестве первого простого аргумента формы)'
- метод будет патч
- это отправит запрос
OutfittersController
обновить действие
Для создания ввода внутри блока simple_form вы делаете следующее:
<%= simple_form_for @outfitter do |f| %>
# f - is the form object
# input - is the method called on the form to create the input
# :name - is the attribute name that will be mapped to this input
# you can only create inputs for the attributes in your class
<%= f.input :name %>
<%= f.input :address %>
<% end %>
- простая форма по умолчанию создаст метки для ввода с именем атрибута
Чтобы создать вложенную форму с простой формой, вам нужно будет сделать следующее
<%= simple_form_for @outfitter do |f| %>
# calling f.simple_fields_for will ensure simple_form knows the users form is nested under outfitter form
<%= f.simple_fields_for :users do |user_form| %>
# user_form is the form object nested under outfitters form
# every input method inside this block should be called on user_form
<%= user_form.input :name %>
<%= user_form.input :address %>
<% end %>
<% end %>
Ваше завершение будет следующим:
<%= simple_form_for @outfitter do |f| %>
<div class="modal-message">
<p>
# input_html is used to parse attributes to be added to the input
<%= f.input :name, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<p>
<%= f.input :address, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<p>
<%= f.input :business_phone, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<%= f.simple_fields_for :users do |user_form| %>
<p>
<%= f.input :first_name, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<p>
<%= f.input :last_name, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<p>
<%= f.input :email, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<p>
<%= f.input :password, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<p>
<%= f.input :password_confirmation, input_html: { class: 'input-txt rounded-2px' } %>
</p>
<% end %>
<div class="button rounded-2px trans-all">
<%= f.submit 'Signup', class: 'send-btn rounded-2px trans-all' %>
</div>
<% end %>
С помощью простой формы вы можете сделать гораздо больше, убедитесь, что вы зашли в их репозиторий на github и прочитали документы.
наслаждаться