我正在尝试创建一个系统来检查当前用户是否有权编辑记录。我认为这样做的方法是将@user的变量分配给显示记录的链接ID和一个重定向的私有函数,除非@user
= current_user
,但是当我这样做时,我每次都获得重定向行为(即使用户拥有记录)。
这是控制器设置
def edit
@deal = Deal.find(params[:id])
@user = User.where(params[:id] === @deal.user_id)
correct_user
end
...
private
def correct_user
unless @user === current_user
redirect_to root_path
flash[:error] = 'You can only edit deals that you own'
end
end
用户和交易模型通过多个拥有
相关联class User < ApplicationRecord
has_many :deals
...
class Deal < ApplicationRecord
belongs_to :user
交易架构(用户ID在创建时分配给user_id
)
create_table "deals", force: :cascade do |t|
t.text "headline"
t.string "matter"
t.text "summary"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_deals_on_user_id"
end
该项目是使用Devise设置的,因此也可以使用这些帮助程序。
答案 0 :(得分:1)
使用==
代替===
您只想将@user
与current_user
进行比较
@user == current_user
在此处查看差异=== vs. == in Ruby
您还需要更改
@user = User.where(params[:id] === @deal.user_id)
到
@user = @deal.user
答案 1 :(得分:0)
好的,那么从哪里开始...
首先,请勿使用===
来比较记录,而是使用==
。
其次:
def edit
@deal = Deal.find(params[:id])
@user = User.find_by(params[:id]: @deal.user_id)
correct_user
end
尝试查找用户时,需要提供AR选项作为散列,而不是布尔参数。如果您想在未找到记录时引发异常,请使用find
,或者find_by
只返回nil。
在correct_user
中再次使用==
代替===
。
然而,这段代码仍然不是很漂亮,可以使用一些重构;)