根据Rails中的链接表字段分配实例变量

时间:2017-03-22 12:53:23

标签: ruby-on-rails

我正在尝试创建一个系统来检查当前用户是否有权编辑记录。我认为这样做的方法是将@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设置的,因此也可以使用这些帮助程序。

2 个答案:

答案 0 :(得分:1)

使用==代替===您只想将@usercurrent_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中再次使用==代替===

然而,这段代码仍然不是很漂亮,可以使用一些重构;)