在将Devise实施到现有的Rails项目期间,我遇到了一个问题,即app已经拥有与我们的应用程序相关的会话模型,而不是用户的网络会话。我尝试了几种解决方法,唯一真正有效的方法是重命名我们的模型,但由于一些内部原因,这并不是真的可以接受。
#routes snippet
devise_for :web_users, controllers: {
sessions: 'web_users/sessions'
}
root 'pages#index'
authenticate :web_user do
resources :sessions, only: [:index, :show]
end
这是我通过覆盖控制器得到的最远:
class WebUsers::SessionsController < Devise::SessionsController
before_action :configure_sign_in_params, only: [:create]
# GET /resource/sign_in
def new
super
end
# POST /resource/sign_in
def create
super
end
# DELETE /resource/sign_out
def destroy
super
end
# protected
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_in_params
devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute])
end
end
但是这导致super
块中create
的ActionController :: UnknownFormat异常。
在不需要重命名现有模型的情况下,让Devise在这种情况下发挥出色的最好方法是什么?
答案 0 :(得分:0)
通过在设计视图中编辑赋予 url
的 form_with
参数,我能够解决这个问题。
如果还没有,首先运行 rails generate devise:views
将设计视图复制到您的项目中。
然后打开app/views/devise/sessions/new.html.erb
并将第一行从
<%= form_with(model: resource, as: resource_name, url: session_path(resource_name)) do |f| %>
到
<%= form_with(model: resource, as: resource_name, url: new_user_session_path) do |f| %>
这样,Devise 就不会尝试使用您的会话路由而不是它自己的路由。