当我已经有一个Session域模型时,Rails和Devise

时间:2017-04-15 03:00:36

标签: ruby-on-rails devise

在将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在这种情况下发挥出色的最好方法是什么?

1 个答案:

答案 0 :(得分:0)

通过在设计视图中编辑赋予 urlform_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 就不会尝试使用您的会话路由而不是它自己的路由。