【问题标题】:Rails says that "role", a property I made doesn't existRails 说“角色”,我制作的属性不存在
【发布时间】:2016-02-01 01:36:55
【问题描述】:

我清楚地为用户创建了角色(如下所示),但它说它不存在。请帮忙?顺便说一句,你可以看到我自己是如何硬编码的。

app/controllers/application-controller.rb:

class ApplicationController < ActionController::Base


  protect_from_forgery with: :exception

  helper_method :current_user

  def current_user
      @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  def require_user
      redirect_to '/login' unless current_user
  end

    def require_admin
        redirect_to '/' unless current_user.admin
    end
end
User.create(first_name: "Johnny", last_name: "Appleseed", email: "j.appleseed@example", password: "MY AWESOME PASSWORD THAT NOBODY KNOWS", role: "admin")

db/migrate/20160109170743_create_users:

class CreateUsers < ActiveRecord::Migration
    def change
        create_table :users do |t|
            t.string :first_name
            t.string :last_name
            t.string :email
            t.string :password_digest
            t.string :role, :default => "reader"
            t.timestamps null: false
    end
  end
end

应用程序/控制器/用户控制器:

class UsersController < ApplicationController
    def new
        @user = User.new
    end

    def create
        @user = User.new(user_params)
        if @user.save
            session[:user_id] = @user.id
            redirect_to '/'
        else
            redirect_to '/signup'
        end
    end

    private
        def user_params
              params.require(:user).permit(:first_name, :last_name, :email, :password, :role)
        end
end

【问题讨论】:

  • 你也可以发布错误消息吗?
  • 你确定你迁移了db

标签: ruby-on-rails authentication web-applications dbmigrate


【解决方案1】:

在不知道具体错误信息的情况下,我只能推测你的错误在这里:

def require_admin
   redirect_to '/' unless current_user.admin
end

无论您在模型/数据库中拥有什么属性,您都只会获得您已定义的实例方法。您的User 对象中没有admin,因此使current_user.admin 无效。

您需要使用以下内容:

#app/models/user.rb
class User < ActiveRecord::Base
   def admin? 
      self.role == "admin"
   end
end

current_user.admin? #-> true / false

虽然问号不是必需的,但它表示对象属性的评估 (true / false)。


顺便说一句,您可能希望将enum 添加到您的User 模型中:

#app/models/user.rb
class User < ActiveRecord::Base
   enum role: [:reader, :admin]
end

这将为您提供一系列instance & class methods,以更好地帮助您的逻辑:

@user = User.find params[:id]
if @user.admin?
  ...

@admins = User.admin
#-> collection of "admin" users

为此,您需要将 role 列从 string 更改为 integer

【讨论】:

    【解决方案2】:

    我建议您对列角色使用布尔值。

    用户.rb

     def admin?
        self.role == true
     end
    

    这样你就可以了

    redirect_to '/' unless current_user.admin?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多