Rails设计路由:如果用户已登录,请指向索引。否则,请指向新用户会话

时间:2015-06-21 17:42:23

标签: ruby-on-rails ruby if-statement devise routes

非常简单的问题,但我似乎找不到一个好的老式谷歌的答案。

错误:

undefined method `user_signed_in?' for #<ActionDispatch::Routing::Mapper:0x007fc6369320e8> (NoMethodError)

服务器甚至无法启动。

我的代码:

Rails.application.routes.draw do

devise_for :users, :path_prefix => 'u'
resources :users

  devise_scope :user do
    get "login", to: "devise/sessions#new", as: :login
    get 'logout', to: 'devise/sessions#destroy', as: :logout
    get 'user/edit', to: 'devise/registrations#edit', as: :change_password
  end

  resources :apps do
    resources :elements, controller: 'apps/elements'
  end

  resources :elements do
      resources :features, except: [:index], controller: 'apps/elements/features'
  end

if user_signed_in?
  root to: 'apps#index'
else
devise_scope :user do
  root to: 'devise/sessions#new'
end
end

end

这项工作的最佳方法是什么?作为新的RoR用户,我犹豫是否试图解决它并使网站易受攻击。提前谢谢。

1 个答案:

答案 0 :(得分:2)

在Rails中,访问控制是在控制器层完成的 - 而不是在路由层上。

路由只是为不同的参数集和请求网址定义匹配器。它们在rails甚至开始处理请求之前被处理,他们对会话一无所知。 Rails甚至可以使用YML来定义路由,除了Ruby在DSL上更好。

如果您想要求用户登录,您可以使用:

class SomeController < ApplicationController
  before_action :authenticate_user! # a Devise helper method
end