我一直在将设计构建到一个小型 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
更新:粘贴在正确的跟踪输出中。