我是新的鐵軌,所以請耐心等待。我的問題非常具體。我正在創建一個用戶博客,他們可以放置任何帖子。所以用戶有博客,博客有帖子。所以當用戶創建博客時,博客中的所有帖子都應該由他撰寫。其他用戶不能寫他們的博客。使用權威寶石軌道的授權設置
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
這裏我使用的是隱藏的表單設置這是我從PARAMS採取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
@moveson如果我添加:創建,沒有人可以創建帖子。我認爲這是因爲在授權?方法我檢查是否post.user =當前用戶?但是我在創建後設置post.user,所以在授權中? post.user總是會丟失 –
嘗試在'create'操作中設置'post.user = current_user'後,在下一行放置'authorize_user!'。 – moveson