我正在使用partials将每个表单包含到视图中,传递对象的locals和url params以供form_for
使用第一个(顶级)表单部分:
- form_for :person, local_assigns[:obj], :url => local_assigns[:url] do |person_form|
= person_form.error_messages
%p
= person_form.label :first_name
= person_form.text_field :first_name
%p
= person_form.label :last_name
= person_form.text_field :last_name
%p
= person_form.submit 'Save'
- if local_assigns[:obj]
= link_to 'Destroy', local_assigns[:obj], :confirm => 'Are you sure?', :method => :delete
通过
包含在视图中= render :partial => 'person_form', :locals => { :url => { :controller => 'people', :action => 'create' }, :obj => @person }
创建一个新人,
= render :partial => 'person_form', :locals => { :url => "people/update/#{person.id}", :obj => person }
在这个区块内:
- Person.all.each do |person|
编辑所有现有人。
我的问题是,除第一个(顶级)人员创建和编辑表单外,每个表单都会将操作设置为当前控制器。
所有其他表单的form_for部分非常相似:
- form_for :day, local_assigns[:obj], local_assigns[:url] do |day_form|
= day_form.error_messages
%p
= day_form.label :effective_date, 'Date'
= day_form.datetime_select :effective_date
= day_form.label :person_id
= day_form.collection_select(:person_id, Person.all, :id, :full_name, { :selected => local_assigns[:ref] ? local_assigns[:ref].id : 1 } )
%p
= day_form.submit 'Save'
- if local_assigns[:obj]
= link_to 'Destroy', local_assigns[:obj], :confirm => 'Are you sure?', :method => :delete
包含在
中= render :partial => 'day_form', :locals => { :url => { :controller => 'days', :action => 'create' }, :obj => @day, :ref => person }
表示创建表单,
= render :partial => 'day_form', :locals => { :url => "days/update/#{day.id}", :obj => day, :ref => person }
用于编辑表格。
这两个模型,人与日,由具有许多人的人联系在一起:天和日属于:人。这些关联都设置正确且有效,问题在于使用不同的控制器呈现所有表单以生成正确的操作URL。
有什么建议吗?
(我正在使用haml btw)
答案 0 :(得分:0)
你的语法对我来说有点奇怪。如果将实际对象传递给form_for
,它会自动确定将表单提交到的位置,具体取决于它是新记录还是现有记录。
这样的事情可以帮到你:
# In your controller
# Create a new record
@new_person = Person.new
# And pull out all existing records for editing
@all_people = Person.all
# In whatever view is wrapping your form partials
%h1 Create a new person
= render :partial => 'person_form', :locals => { :person => @new_person }
%h1 Or edit any of the existing people
= render :partial => 'person_form', :collection => @all_people, :as => :person
# In your `person_form` partial
form_for person do |person_form|
... # your usual code here
在您调用form_for
的最后一行代码中,传入一个实际对象 - 根据记录是否为新来推断提交表单的URL(就像{{{ 1}})或已经存在于数据库中(就像@new_person
中的每个人一样)。
这有意义吗?我是否正确理解了问题?
答案 1 :(得分:0)
如果在路由中将Person
和Day
指定为资源,form_for
可以从对象推断出正确的控制器和操作。例如......
在你的人身上:
- form_for @person do |f|
= f.error_messages
= # ...etc...
在你的日子里(人有几天):
- form_for [@person, @day] do |f|
= f.error_messages
= # ...etc...