0

我正在尝试构建一个从Michael Hartl 的 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

@scaffoldapp/controller/scaffolds_controller.rb 中创建:

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_pathuser_scaffolds_path暗示其他问题的方法的方法?

用户模型has_many :scaffolds和脚手架模型belongs_to :user

4

2 回答 2

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_onehas_many关系等而变化。第一次通过这个你可能只是把你的头发扯掉 - 如此公平的警告。

另一方面,如果...

...您想单独使用Scaffold对象作为嵌套路由的一部分,您可以声明该路由两次 - 一次用于您想将其用作嵌套资源,一次用于您想单独使用它.

# config/routes.rb
resources :users do
  resources :scaffolds
end

resources :scaffolds

有了这个,当你跑步时,你rake routes会看到所有标准动作。users_scaffolds_pathscaffolds_path

于 2013-04-08T21:01:27.163 回答
0

缺少方法的原因是form_for视图中不知道我们正在嵌套。这是通过给它一个数组来解决的:

form_for([@user, @scaffold])
于 2013-04-16T09:46:11.983 回答