资源和控制器生成器之间的区别

时间:2011-06-02 15:32:36

标签: ruby-on-rails ruby-on-rails-3

当我做的时候

rails g model user name:string
rails g controller users index create new destroy show

并编辑config / routes.rb以添加:

resource :users

捆绑exec rake路由给出:

     users POST   /users(.:format)      {:action=>"create", :controller=>"users"}
 new_users GET    /users/new(.:format)  {:action=>"new", :controller=>"users"}
edit_users GET    /users/edit(.:format) {:action=>"edit", :controller=>"users"}
           GET    /users(.:format)      {:action=>"show", :controller=>"users"}
           PUT    /users(.:format)      {:action=>"update", :controller=>"users"}
           DELETE /users(.:format)      {:action=>"destroy", :controller=>"users"}

然而,当我做

rails g resource users name:string

(自动添加资源:用户到config / routes.rb)     捆绑执行耙路线

我得到了

    users GET    /users(.:format)          {:action=>"index", :controller=>"users"}
          POST   /users(.:format)          {:action=>"create", :controller=>"users"}
 new_user GET    /users/new(.:format)      {:action=>"new", :controller=>"users"}
edit_user GET    /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
     user GET    /users/:id(.:format)      {:action=>"show", :controller=>"users"}
          PUT    /users/:id(.:format)      {:action=>"update", :controller=>"users"}
          DELETE /users/:id(.:format)      {:action=>"destroy", :controller=>"users"}

所以我的问题是,

当我生成一个控制器时,我如何才能获得正确的辅助方法 link_to'Destroy',instance,:method => :删除 工作?

因为当前它给出了错误,所以没有定义user_path。

4 个答案:

答案 0 :(得分:12)

你应该致电

rails g controller user index create new destroy show

而不是

rails g controller users index create new destroy show

为了让resources :users为您提供所需的帮助。

后者导致Rails假设users是一个单数对象,而resources :users应该创建一个所谓的奇异资源:

http://guides.rubyonrails.org/routing.html#singular-resources

因此,user_path未定义,而users_path已定义。

答案 1 :(得分:1)

使用rails g controller并指定方法名称时,生成器仅将特定路由映射到routes文件。 rails g resource假定您需要整个资源功能,并将映射resources

为了解决这个问题,只需进入您的路径文件并用资源调用替换特定的映射。

resources :users

答案 2 :(得分:0)

我真正想要的是为现有模型创建一个工作(具有正确的删除/显示路径)控制器的方法(如问题中所述),但只是添加“resource:x”并生成控制器是不够的

我最终使用了scaffold_controller生成器。它不会创建任何迁移或模型,但会生成包含视图的资源,rake paths命令会显示删除和显示正常的路径。

答案 3 :(得分:0)

您可以在控制台中运行以下命令:

$rails g model user name:string
$rails g scaffold_controller User

并将此代码行添加到文件routes.rb:

resources :users