Rails 2.3.8 form_for partials没有生成正确的动作URL

时间:2010-08-29 19:23:34

标签: ruby-on-rails

嘿,我在同一页面上有一堆不同控制器的表格。这是因为有一堆模型相互堆叠,这是编辑它们的最佳方式。

我正在使用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)

2 个答案:

答案 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)

如果在路由中将PersonDay指定为资源,form_for可以从对象推断出正确的控制器和操作。例如......

在你的人身上:

- form_for @person do |f|
  = f.error_messages
  = # ...etc...

在你的日子里(人有几天):

- form_for [@person, @day] do |f|
  = f.error_messages
  = # ...etc...