【问题标题】:Devise routing error while using multiple models - RAILS 4.2.0使用多个模型时设计路由错误 - RAILS 4.2.0
【发布时间】:2016-11-24 14:17:17
【问题描述】:

实际上,我在我的应用程序中使用了两个模型,即用户和管理员,并且我在使用 devise gem 时遵循了要处理的每个步骤。

而且我想要多次登录。当用户登录时,必须重定向到各自的个人资料,当管理员登录时,必须重定向到他各自的个人资料。

我不知道我在哪里犯错了。

home/index.html.erb

<ul>
    <li>User:<%= link_to 'User', new_user_session_path, target: "_blank" %></li>
    <li>Admin:<%= link_to 'Admin', new_admin_session_path, target: "_blank" %></li>
</ul>

当我转到 User 链接时,它给了我如下路由错误;

当我转到 Admin 链接时,它给了我如下路由错误;

routes.rb

Rails.application.routes.draw do

root "home#index"

  devise_for :users, controllers: {
        sessions: 'users/sessions',
        registrations: 'users/registrations'
      }   

  devise_scope :user do
    authenticated  do
      root to: 'aslani#index', as: 'authenticated_user_root'
    end

    unauthenticated do
      root to: 'aslani#index', as: 'unauthenticated_user_root'
    end
  end

  devise_for :admins, controllers: {
        sessions: 'admins/sessions',
        registrations: 'admins/registrations'
      }

  devise_scope :admin do
    authenticated  do
      root to: 'yaseen#index', as: 'authenticated_admin_root'
    end

    unauthenticated do
      root to: 'yaseen#index', as: 'unauthenticated_admin_root'
    end
  end

end

aslani/index.html.erb

        <% if user_signed_in? %>
          I am Aslani.
           <%= link_to 'Log out', destroy_user_session_path, method: :delete %>
        <% else %>
          <%= link_to 'Log In', new_user_session_path %>
          <%= link_to 'Sign Up', new_user_registration_path %>
        <% end %>

kola/index.html.erb

    <% if admin_signed_in? %>
       I am Kola.
      <%= link_to 'Log out', destroy_admin_session_path, method: :delete %>
    <% else %>
      <%= link_to 'Log In', new_admin_session_path %></li>
      <%= link_to 'Sign Up', new_admin_registration_path %>
    <% end %>

app/controllers/users/sessions_controller.rb

 class Users::SessionsController < Devise::SessionsController
       def new
        super
       end

       def create
          self.resource = warden.authenticate!(auth_options)
          set_flash_message(:notice, :signed_in) if  is_navigational_format?
          sign_in(resource_name, resource)
          if !session[:return_to].blank?
            redirect_to session[:return_to]
            session[:return_to] = nil
          else
             respond_with resource, :location =>      after_sign_in_path_for(resource)
          end
     end
   end

欢迎提出任何建议。

提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    当您在用户名称空间下使用会话控制器时,

    devise_for :users, controllers: {
            sessions: 'users/sessions',
            registrations: 'users/registrations'
    }   
    

    你的 session_controller 路径应该是,

    app/controllers/users/sessions_controller.rb
    
        class Users::SessionsController < Devise::SessionsController
           def new
            super
           end
    
           def create
              self.resource = warden.authenticate!(auth_options)
              set_flash_message(:notice, :signed_in) if  is_navigational_format?
              sign_in(resource_name, resource)
              if !session[:return_to].blank?
                redirect_to session[:return_to]
                session[:return_to] = nil
              else
                 respond_with resource, :location =>      after_sign_in_path_for(resource)
              end
         end
       end
    

    您在que中填写的表格应为app/views/users/sessions/new.html.erb

      <h2>Log in</h2>
    
    <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email, autofocus: true %>
      </div>
    
      <div class="field">
        <%= f.label :password %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>
    
      <% if devise_mapping.rememberable? -%>
        <div class="field">
          <%= f.check_box :remember_me %>
          <%= f.label :remember_me %>
        </div>
      <% end -%>
    
      <div class="actions">
        <%= f.submit "Log in" %>
      </div>
    <% end %>
    
    <%= render "users/shared/links" %>
    

    【讨论】:

    • 感谢您的回复。我将在新文件 users/session_controller.rb 中放入哪些数据
    • 它应该包含创建用户会话的操作,我更新了答案请检查
    • 控制器中不应该有表单或html
    • 谢谢。但是路由错误未初始化常量Users::SessionsController
    • 更改了答案请检查,如果您想要用户名称空间,class Users::SessionsController &lt; Devise::SessionsController
    【解决方案2】:

    如果您将路由中的控制器更改为

    devise_for :users, controllers: { registrations: 'registrations', sessions: 'sessions', passwords: 'passwords', confirmations: 'confirmations', }

    并将您的控制器保留为 app/controllers/session_controller.rb 将完成这项工作。

    【讨论】:

    • 感谢您的回复。我将在新文件 /session_controller.rb 中放入什么
    • 再次给我路由错误未初始化常量 SessionsController
    • 谢谢,请看一下我的 session_controller.rb。
    • 你不应该在控制器中创建表单。控制器应始终包含一个动作和重定向逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多