Ruby on rails 3 如何重新路由标准rest操作以设计控制器?

Ruby on rails 3 如何重新路由标准rest操作以设计控制器?,ruby-on-rails-3,devise,controller,Ruby On Rails 3,Devise,Controller,我一直在将Desive构建成一个小的Rails应用程序。这是一个相当标准的设置,但有一个缺点是需要更改此项目的默认身份验证规则。非幂等注册操作必须仅限于经过身份验证的用户 为此,我编写了一个自定义注册控制器,并将其链接到路由中。定制控制器真正要做的就是改变过滤要求。基于Rails控制器过滤,我以最小的努力实现了这一点 但就其本身而言,这只适用于设计特定的操作,如/users/sign\u或/users/edit。我还想将标准Rails操作(/users/new、/users/1/edit等)连接

我一直在将Desive构建成一个小的Rails应用程序。这是一个相当标准的设置,但有一个缺点是需要更改此项目的默认身份验证规则。非幂等注册操作必须仅限于经过身份验证的用户

为此,我编写了一个自定义注册控制器,并将其链接到路由中。定制控制器真正要做的就是改变过滤要求。基于Rails控制器过滤,我以最小的努力实现了这一点

但就其本身而言,这只适用于设计特定的操作,如/users/sign\u或/users/edit。我还想将标准Rails操作(/users/new、/users/1/edit等)连接到自定义控制器。我可以让动作实例化控制器——可以说是把马引向水——但是当动作是新的而不是注册时,它会在过滤过程中崩溃

问题似乎是,当操作为“新建”时,resource\u name的结果为零,但当操作为“注册”时,结果为零。我不明白为什么Desive会在意,或者代码中的区别在哪里。我看过其他的问题,比如和,但他们没有涉及到这个问题

我得到的具体错误是

注册控制器中的命名错误#新增

nil:NilClass的未定义方法“name”

轨迹的顶部是

设计(2.1.2)应用程序/控制器/设计控制器。rb:22:in
resource\u name'app/controllers/registrations\u controller.rb:104:in
authenticate\u scope!'

这显然是第一次引用design_映射时发生的。但是根据上面的stackoverflow问题,我还明确提供了Desive_映射的帮助程序,他们甚至没有被调用

有人能解释一下或帮我找出进一步的方向吗

从routes.rb:

Fs::Application.routes.draw do
  devise_for :users, :controllers => { :registrations => 'registrations' } 
  resources :users, :except => [:index, :show], :controller => 'registrations'
  resources :users, :only => [:index, :show]
[……]

rake routes报告:

        new_user_session GET    /users/sign_in(.:format)            devise/sessions#new
            user_session POST   /users/sign_in(.:format)            devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)           devise/sessions#destroy
           user_password POST   /users/password(.:format)           devise/passwords#create
       new_user_password GET    /users/password/new(.:format)       devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)      devise/passwords#edit
                         PUT    /users/password(.:format)           devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)             registrations#cancel
       user_registration POST   /users(.:format)                    registrations#create
   new_user_registration GET    /users/sign_up(.:format)            registrations#new
  edit_user_registration GET    /users/edit(.:format)               registrations#edit
                         PUT    /users(.:format)                    registrations#update
                         DELETE /users(.:format)                    registrations#destroy
                   users POST   /users(.:format)                    registrations#create
                new_user GET    /users/new(.:format)                registrations#new
               edit_user GET    /users/:id/edit(.:format)           registrations#edit
                    user PUT    /users/:id(.:format)                registrations#update
                         DELETE /users/:id(.:format)                registrations#destroy
                         GET    /users(.:format)                    users#index
                         GET    /users/:id(.:format)                users#show
我的注册\u controller.rb:

class RegistrationsController < Devise::RegistrationsController
  prepend_before_filter :authenticate_scope!, :except => [:index, :show]
  skip_filter :require_no_authentication
end
使用:

轨道3.2.6

Ruby 1.9.3

设计2.1.2


更新:粘贴到正确的跟踪输出中。

因此一种解决方案似乎是添加

  devise_scope :user do
    get '/users/new' => 'registrations#new'
  end

进入routes.rb。这可能不是最好的答案,但它是有效的。

因此,一个解决方案似乎是添加

  devise_scope :user do
    get '/users/new' => 'registrations#new'
  end
进入routes.rb。这可能不是最好的答案,但它是有效的