Как мне использовать одну форму в представлении для нескольких моделей в Rails 3?
У меня есть одна форма.
Эта форма в настоящее время находится в представлении для модельного сообщения.
Иногда я хочу иметь возможность связать контакт (имя, фамилию) с этим конкретным сообщением. Контакт - это собственная модель.
Когда форма отправлена, Сообщение имеет атрибут contact_id. Я хотел бы, чтобы этот contact_id был связан, но также чтобы создать новый контакт.
Как мне это сделать в Rails 3?
2 ответа
Кажется, что вы хотите, чтобы объекты Contact и Message создавались из одной формы и связывали их. Как я уже говорил вам в предыдущем вопросе. form_for может принимать как отдельные значения, так и значения других объектов.
_form.html.erb
<% form_for :message do |f| %>
<%= f.test_field :some_field %>
..
..
<%= text_field :contact, :first_name %>
<%= text_field :contact, :last_name %>
<%= f.submit %>
<% end %>
messages_controller.rb
def new
@message = Message.new
@contact = Contact.new
end
def create
@message = Message.new(params[:message])
@contact = Contact.new(params[:contact])
@contact.message = @message
if @contact.save # saves both contact and message if has_one relation is given in models
..
else
...
end
end
Но, как говорится, лучше использовать модель вложенных форм. Для этого вам придется написать код с contact
,
contacts_controller.rb
def new
@contact = Contact.new
@contact.message.build
end
def create
@contact = Contact.new(params[:contact])
if @contact.save
..
else
..
end
end
_form.html
<% form_for :contact do |f| %>
<% f.fields_for :message do |p| %>
<%= p.text_field :some_field %>
...
<% end %>
<%= f.text_field :first_name %>
<%= f.text_field :second_name %>
<%= f.submit %>
<% end %>
Для этого вам нужно будет указать accepts_nested_attributes_for :message
в Contact.rb
С вложенной модельной формой.
Посмотрите на: http://asciicasts.com/episodes/196-nested-model-form-part-1
Он основан на Rails 2, но для того, чтобы сделать код совместимым с Rails 3, не нужно ничего делать.