如何正确处理嵌套资源/路由?

时间:2013-04-08 20:54:30

标签: ruby-on-rails routes nested-routes

我正在尝试构建一个从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_pathuser_scaffolds_path方法?

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

2 个答案:

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

答案 1 :(得分:0)

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

form_for([@user, @scaffold])