嵌套资源的form_for语法是什么?

时间:2010-03-18 11:24:02

标签: ruby-on-rails

我正在尝试为嵌套资源创建表单。这是我的路线:

map.resources :websites do |website|
  website.resources :domains
end

以下是我的尝试和错误:

<% form_for(@domain, :url => website_domains_path(@website)) do | form | %>
<%= form.text_field :name %>

# ArgumentError: wrong number of arguments (1 for 0)
# form_helper.rb:290:in 'respond_to?'
# form_helper.rb:290:in 'apply_form_for_options!'
# form_helper.rb:277:in 'form_for'

<% form_for([@website, @domain]) do | form | %>
<%= form.text_field :name %>

# ArgumentError: wrong number of arguments (1 for 0)
# form_helper.rb:290:in 'respond_to?'
# form_helper.rb:290:in 'apply_form_for_options!'
# form_helper.rb:277:in 'form_for'

<% form_for(:domain, @domain, :url => website_domains_path(@website)) do | form | %>
<%= form.text_field :name %>

# ArgumentError: wrong number of arguments (1 for 0)
# wrapper.rb:14:in 'respond_to?'
# wrapper.rb:14:in 'wrap'
# active_record_helper.rb:174:in 'error_messages_for'

<% form_for(:domain, [@website, @domain]) do | form | %>
<%= form.text_field :name %>

# UndefinedMethodError 'name' for #<Array:0x40fa498>

我已确认@website@domain都包含正确类的实例。

例如,正确生成的路径也是这样使用的,所以我不认为它们是路径或网址助手的问题。

<%= website_domains_path(1) %>
<%= website_data_source_path(1, 1) %>

Rails 2.3.5

3 个答案:

答案 0 :(得分:1)

我刚试过:

<% form_for @note, :url => teams_person_notes_path(@person) do |f| %>
  <%= f.text_field :note %>
  <%= f.submit "Add" %>
<% end %>

它没有任何问题。我的路线看起来像这样:

  map.namespace :teams do |t|
    t.resources :people do |p|
      p.resources :notes
    end
  end

所以它和你的一样(只添加名称空间,但不是这样)。

当然,您的示例表单适用于@domain的新对象。它不适用于编辑操作,那么您应该:

 <% form_for @domain, :url => edit_website_domain_path(@website, @domain) do |form| %>

答案 1 :(得分:1)

您可以使用

<%= form_for [@website, @domain] %>

@domain属于@website

的位置

答案 2 :(得分:0)

当它最终点击时,这是如此明显,我有一个名为respond_to的字段。它当然超越了现有的方法。

令人遗憾的是,当数据库列覆盖已定义的方法时,ActiveRecord不会发出警告......