0

我一直在将设计构建到一个小型 Rails 应用程序中。这是一个非常标准的设置,但有一个问题是需要更改此项目的默认身份验证规则。非幂等注册操作必须全部仅限于经过身份验证的用户。

为此,我编写了一个自定义注册控制器并将其链接到路由中。自定义控制器真正要做的就是改变过滤要求。基于 Rails 控制器过滤文档,我以最少的努力完成了这项工作。

但它本身仅适用于设计特定的操作,如 /users/sign_up 或 /users/edit。我还想将标准 Rails 操作(/users/new、/users/1/edit 等)连接到自定义控制器。我可以获得实例化控制器的动作——可以说是把马带到水边——但是当动作是新的而不是sign_up时,它会在过滤过程中崩溃。

问题似乎是当操作为“新”时 resource_name 产生 nil,但当它是“sign_up”时很好。我不明白为什么设计关心或代码中表示区别的地方。我查看了其他问题,例如更新设计的用户控制器覆盖设计注册控制器自定义设计控制器,但他们没有涉及到这个问题。

我得到的具体错误是

RegistrationsController 中的 NoMethodError#new

nil:NilClass 的未定义方法“名称”

并且迹线的顶部是

设计(2.1.2)app/controllers/devise_controller.rb:22:in resource_name' app/controllers/registrations_controller.rb:104:in authenticate_scope!'

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

任何人都可以解释或帮助我找出进一步看的地方吗?

来自 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]

[...]

耙路线报告:

        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

我的registrations_controller.rb:

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

我的 users_helper.rb:

module UsersHelper
  # used by devise
  def resource_name
    :user 
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end

使用:

导轨 3.2.6

红宝石 1.9.3

设计 2.1.2

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

4

1 回答 1

3

所以一种解决方案似乎是添加

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

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

于 2012-07-26T02:27:33.403 回答