我的主要设计路线是:
devise_for :accounts, :controllers => { :registrations => "users/accounts/registrations", :sessions => "accounts/devise/sessions" }, :class_name => 'Admin'
然后我想要一个新的url / action,所以我在上面的devise_for行之前添加以下内容:
match '/accounts/signedup/' => 'users/accounts/registrations#signedup':
然后在控制器中我有signedup动作,但当我去myurl.com/accounts/signedup时,目前只有:
def signedup
Rails.logger.debug { "&& signed_up" }
end
然后我去myurl.com/accounts/signedup我得到:
AbstractController::ActionNotFound (AbstractController::ActionNotFound):
但如果我从控制器中删除def signedup,我会得到:
The action 'signedup' could not be found for Users::Accounts::RegistrationsController"
知道什么是错的吗?
答案 0 :(得分:18)
您的回答是正确的,但最新版本的设计已弃用此行为:
不推荐将块传递给devise_for。请从devise_for中删除该块(只有块,对devise_for的调用必须仍然存在)并调用devise_scope:user do ...以块结束。
根据您发布的内容判断,在您的情况下,您应该在自定义RegistrationsController中使用after_sign_in_path_for
。
以下是我在项目中使用的替代方法:
devise_scope :user do
get 'session/on_signin', :to => 'sessions#memorize_session'
end
答案 1 :(得分:13)
解决方案是:
devise_for :accounts, :controllers => { :registrations => "users/accounts/registrations", :sessions => "accounts/devise/sessions" }, :class_name => 'Admin' do
get "accounts/signedup", :to => "users/accounts/registrations#signedup", :as => "signedup_registration"
end
答案 2 :(得分:7)
使用以下内容(确保其不是复数,否则您将收到上述错误)。
devise_scope :user do
get 'session/on_signin', :to => 'sessions#memorize_session'
end
然后,如果需要传递自定义控制器,则可以像往常一样修改devise_for。
devise_for:users