gpt4 book ai didi

ruby-on-rails - 如何以当前用户或非用户身份更新资源?

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:44 25 4
gpt4 key购买 nike

在我的应用程序中,我有以下资源 Post 和 User。我希望用户能够更新他们自己的帖子和访客帖子,我希望访客能够更新其他访客帖子但不能更新用户。 guest 只是非用户 (@post.user.blank)。

Post Model
belongs_to :user
# columns: user_id, name, body
end

User Model
has_many :posts
end

我的 Controller 让我感到困惑,因为我不确定如何使当前用户或 guest 可以更新帖子,而不允许所有人更新任何人的帖子。主要是另一个用户更新另一个用户的帖子。

  def update
@post = Post.find(params[:id])
if @post.update(post_params)
redirect_to @post
else
render action: 'edit'
end
end

def post_params
params.require(:post).permit(:name, :body)
end

我想做的是:

  def update
@post = Post.find(params[:id])
if @post.user == current_user or @post.user.blank?
if @post.update(post_params)
redirect_to @post
else
render action: 'edit'
end
end
end

但我不确定这有多安全。似乎一个用户可以访问另一个用户的帖子。

这样对吗?我怎么能这样做?

最佳答案

我的方法是在内存上使用带有“update_user”附加属性的自定义验证,如下所示:

class Post < ActiveRecord::Base
belongs_to :user

attr_accessor :update_user
validate :validate_user_scope, on: :update

private

def validate_user_scope
if !(user.blank? || user == update_user)
errors.add(:update_user, :not_permitted)
end
end
end


class User < ActiveRecord::Base
has_many :posts
end

当然,这个优点是检查逻辑是在模型级别(而不是 Controller )的 Rails 验证下完成的。

我认为用户的访问范围(或访问权限)应该是“业务逻辑”之一,“业务逻辑”应该是模型逻辑之一,这样写在模型级别会很好。

我认为user2784630在以下片段的检查逻辑应该没问题:

if @post.user == current_user or @post.user.blank?

但是,如果你担心这个逻辑的全面性,还是写test或者rspec吧。以下是带有固定装置的 test/models/post_test.rb 示例:

require 'test_helper'

class PostTest < ActiveSupport::TestCase
...
# test all of posts of guest, user-A, and user-B are updated by
# guest, user-A, and user-B
test "update guest post by user_A" do
p = posts(:guest_post)
p.update_user = users(:user_A)
assert p.valid?
end
...
end

关于ruby-on-rails - 如何以当前用户或非用户身份更新资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26447518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com