2010-03-18 64 views
2

我想创建一个嵌套资源的窗体。下面是我的路线:什么是嵌套资源的form_for语法?

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

回答

1

您可以使用

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

@domain属于@website

+0

尽管我的问题的解决方案是对问题的正确答案,但我更愿意将点数奖给别人以外的人! – Kris 2010-03-31 11:07:01

+0

'for_for' - >'form_for'(我无法直接编辑) – static 2013-10-01 08:16:57

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| %> 
+0

这可能是一个比我首先想到的更深的问题。表单示例是针对一个新对象的,即。 @ domain.new_record? #=> true。 – Kris 2010-03-18 14:58:21

+0

我认为你的第二个例子也应该可以工作,但是对于新的和编辑都是如此。所以可能你在其他地方有错误。你是否用'end'关闭了所有的块?或者,尝试从表单中删除所有字段。 – klew 2010-03-18 16:25:02

0

这是如此明显,当它终于点击,我有一个域名为respond_to。当然,它覆盖了现有的方法。

它是一种耻辱的ActiveRecord并不时发出警告的数据库列将覆盖已定义的方法...