我正在尝试实施一项政策,将帖子的创建限制为管理员或企业。 反过来,只有创建帖子的记录所有者(企业)或管理员可以编辑。但是我收到一个错误,说"未定义的方法用户"有人可以在这里帮忙吗?
Schema.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
如果您收到"未定义方法用户"错误,这意味着该用户为 nil,并且您在帖子的显示视图中调用policy(@post).edit?
,这意味着它会搜索 post_policy.rb 文件中定义的编辑方法(如果您没有 post_policy.rb 文件,则直接搜索您的 application_policy.rb) def edit?
, 这反过来调用 Update 方法def update?
最后更新方法被调用为:
def update?
user.present? && (record.user == user || user.admin?)
end
这意味着用户为 nil,而您正在调用record.user
,这就是这里的问题,因为record
没有调用任何内容,您需要仔细检查您的帖子模型并确保帖子属于用户。
class Post < ActiveRecord::Base
belongs_to :user
end