我看到了很多关于如何在设计中重命名已经声明的路线的帖子。我想扩展设计以拥有自己的路由检查和空闲会话。我正在每隔1分钟实施一次简单的JS检查,我想在devise会话控制器中点击“ check_active”。我尝试了这个,但是没有运气:
devise_scope :sessions do
get 'check_active'
end
是否可以通过自定义路线(而不是重命名已存在的路线)进行扩展设计?
更新-几乎在那里,我做到了
# already had this in routes
devise_for :users, :controllers =>
{ registrations: 'registrations',
confirmations: 'confirmations',
sessions: 'sessions',
passwords: 'passwords',
omniauth_callbacks: "omniauth_callbacks"}
# added this
devise_scope :sessions do
get '/check_active' => 'sessions#check_active'
end
我有一个js触发,我得到了'/ check_active',因为耙线显示了这一点:
check_active GET /check_active(.:format)
但是当它触发时,控制器404会用
AbstractController :: ActionNotFound(找不到路径“ / check_active”的设备映射。
发生这种情况可能有两个原因:
1) You forgot to wrap your route inside the scope block. For example:
devise_scope :user do
get "/some/route" => "some_devise_controller"
end
2) You are testing a Devise controller bypassing the router.
If so, you can explicitly tell Devise which mapping to use:
@request.env["devise.mapping"] = Devise.mappings[:user]
):
答案 0 :(得分:1)
如果要覆盖Devise的默认控制器,则添加自己的路由与其他任何控制器没有什么不同。
create your devise controllers覆盖后,请执行以下操作:
在sessions_controller下声明一个方法
# app/controllers/devise/sessions_controller.rb
def check_active
# do what you want to do
end
在您的路由器中:
# config/routes.rb
devise_scope :sessions do
get 'check_active', to: "devise/sessions#check_active"
end
答案 1 :(得分:0)
我在尝试相同的事情,并且意识到范围应该是user
而不是sessions
,还要确保它必须是单数。
devise_scope :user do
get '/check_active' => 'sessions#check_active'
end