【发布时间】:2016-11-15 15:03:21
【问题描述】:
我是 Rails 新手,请多多包涵。我的问题很具体。我正在创建一个用户博客,他们可以在其中放置任何帖子。所以用户有博客,博客有帖子。因此,当用户创建博客时,他博客中的所有帖子都应该由他撰写。其他用户不能在他们的博客上写。
post_controller.rb
class PostsController < ApplicationController
before_action :authenticate_user!
before_action :authorize_user!, only: [:edit, :update, :destroy]
expose :blog
expose :post
def show
end
def new
end
def edit
end
def create
post.user = current_user
post.save
respond_with post, location: user_blog_path(post.blog.user, post.blog)
end
def update
post.update(post_params)
respond_with post, location: user_blog_path(post.blog.user, post.blog)
end
def destroy
post.destroy
respond_with post, location: user_blog_path(post.blog.user, post.blog)
end
private
def authorize_user!
authorize(post, :authorized?)
end
def post_params
params.require(:post).permit(:title, :content, :user_id, :blog_id)
end
end
我在这里使用权威人士来授权用户,当他们更新或销毁帖子时(用户只能更新或销毁他们自己的帖子)并且它完美地工作。
查看/帖子/新
.row
.columns
h2 = title("New post")
.row
.medium-5.columns
= simple_form_for post do |f|
= f.error_notification
.form-inputs
= f.input :title
= f.input :content
= f.hidden_field :blog_id, value: blog.id
.form-actions
= f.button :submit
这里我使用隐藏表单来设置我从参数中获取的 blog_id。 Http 链接看起来像 http://localhost:3000/posts/new?blog_id=6。问题是每个用户都可以复制此链接来创建帖子(他们不是博客所有者)。
post_policy.rb
class PostPolicy < ApplicationPolicy
def authorized?
record.user == user
end
end
在创建帖子之前我应该如何检查博客的所有者?也许我有错误的方式来创建这样的帖子(使用隐藏表单)。
创建新帖子的链接
= link_to 'New Post', new_post_path(blog_id: blog.id)
【问题讨论】:
-
您的
before_action仅在编辑、更新和销毁时运行。不确定它是否能解决问题,但我认为您需要先将:create添加到列表中。 -
@moveson 如果我添加 :create,没有人可以创建帖子。我想是因为在授权?方法我检查 post.user = 当前用户?但是我在创建后设置了post.user,所以在授权? post.user 总是为零
-
在
create操作中设置post.user = current_user后,尝试将authorize_user!放在下一行。 -
@moveson 无论如何都不起作用
标签: ruby-on-rails ruby ruby-on-rails-4 pundit