0

我正在尝试实施一项政策,将帖子的创建限制为管理员或企业。反过来,只有创建帖子或管理员的记录所有者(企业)可以编辑。但是我收到一条错误消息,说“未定义的方法用户”有人可以在这里帮忙吗?

架构.rb

create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string   "unconfirmed_email"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "role"

create_table "posts", force: true do |t|
    t.string   "name"
    t.string   "title"
    t.text     "content"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end

用户.rb

def admin?
    role == 'admin'
  end

  def biz?
    role == 'biz'
  end

Post_controller

def edit
    @post = Post.find(params[:id])
     authorize @post
  end

Post.show.html.erb

<% if policy(@post).edit? %>
    <%= link_to 'Edit', edit_post_path(@post) %> |
  <% end %>

应用程序.策略

def create?
    user.present? && ( user.admin? || user.biz?)
  end

  def new?
    create?
  end

  def update?
    user.present? && (record.user == user || user.admin?)
  end

  def edit?
    update?
  end
4

1 回答 1

0

如果您收到“未定义方法用户”错误,这意味着用户是 nilpolicy(@post).edit? ,并且您在post 的显示视图中调用,这意味着它搜索您的 post_policy.rb 文件中定义的编辑方法(或直接到你的 application_policy.rb 如果你没有 post_policy.rb 文件) def edit?,它又调用更新方法def update?,最后更新方法被称为:

def update?
  user.present? && (record.user == user || user.admin?)
end

这意味着 user 是 nil,而你正在调用record.user,这就是这里的问题,因为record没有调用任何东西,你需要仔细检查你的 post 模型并确保 post 属于 user

class Post < ActiveRecord::Base
  belongs_to :user
end
于 2015-03-13T06:09:39.153 回答