Rails说,“角色”,我所制造的财产并不存在

时间:2016-02-01 01:36:56

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

我明确地为用户做了这个角色(正如你在下面看到的那样),但它说它不存在。请帮忙?顺便说一下,你可以看到我是如何硬编码的。

应用程序/控制器/应用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")

分贝/迁移/ 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

2 个答案:

答案 0 :(得分:0)

在不知道具体错误消息的情况下,我只能推测您的错误在此处:

admin

无论您在模型/数据库中使用哪些属性,您都只能获得定义的实例方法。您的User对象中没有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

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

另外,您可能希望在#app/models/user.rb class User < ActiveRecord::Base enum role: [:reader, :admin] end 模型中添加enum

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

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

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

role

要执行此操作,您需要将string列从integer更改为$sql_res = "select link, description, resources, keyword from _db where (description like '%$q1%' or keyword like '%$q1%') AND (description like '%$q2%' or keyword like '%$q2%')";

答案 1 :(得分:-1)

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

User.rb

 def admin?
    self.role == true
 end

所以你可以做到

redirect_to '/' unless current_user.admin?