我正在尝试构建一个从Michael Hartl's Railstutorial修改的Rails应用。该代码位于GitHub。
我使用以下嵌套资源:
resources :users do
resources :scaffolds
end
但是我收到以下错误:
ActionView::Template::Error (undefined method `scaffolds_path' for #<# <Class:0x007f87848019d0>:0x007f8782651948>):
4:
5: <div class="row">
6: <div class="span6 offset3">
7: <%= form_for(@scaffold) do |f| %>
8: <%= render 'shared/error_messages', object: f.object %>
9: <%= f.text_field :name, placeholder: "Scaffold name" %>
10: <%= f.text_area :description, placeholder: "Description" %>
app/views/scaffolds/new.html.erb:7:in `_app_views_scaffolds_new_html_erb___1119296061714080468_70109999031900'
我很困惑为什么要寻找scaffolds_path
而不是user_scaffolds_path
?
在app / controller / scaffolds_controller.rb中创建@scaffold
:
def new
@scaffold = current_user.scaffolds.build
end
检查由此创建的@scaffold
对象显示:
'#<Scaffold id: nil, name: nil, description: nil, tax_id: nil, user_id: 36, created_at: nil, updated_at: nil>'
转发@scaffold
的方法时,不会显示任何暗示其他问题的scaffolds_path
或user_scaffolds_path
方法?
用户建模has_many :scaffolds
和脚手架模型belongs_to :user
。
答案 0 :(得分:1)
它与表单助手有关。如果您正在使用嵌套资源并且从不希望直接对Scaffold
个对象执行控制器操作,那么您需要在表单视图和模型中执行以下操作。类似的东西:
# app/models/user.rb
class User < ActiveRecord::Base
...
accepts_nested_attributes_for :scaffolds
end
......并且在视图中......
<%= form_for(@user) do |f| %>
...
<%= fields_for @user.scaffold do |scaffold_fields| %>
...这将导致fields_for
的路径为您提供预期的users_scaffolds_path
请注意,使用fields_for
帮助程序的具体细节取决于它是has_one
还是has_many
关系等。第一次通过这个你可能只是撕掉你的头发 - 这是公平的警告。
...您希望在自己的和上使用Scaffold
个对象作为嵌套路由的一部分,您可以将路由声明两次 - 一次用于何时将其用作一个嵌套的资源,一旦你想独立使用它。
# config/routes.rb
resources :users do
resources :scaffolds
end
resources :scaffolds
有了这个,当您运行rake routes
时,您会看到所有标准操作都users_scaffolds_path
和scaffolds_path
。
答案 1 :(得分:0)
缺少方法的原因是视图中的form_for
不知道我们正在嵌套。这是通过给它一个数组来修复的:
form_for([@user, @scaffold])