2017-03-22 3 views
0

現在のユーザーがレコードを編集する権限を持っているかどうかを確認するシステムを作成しようとしています。私はそれを行う方法は、表示されたレコードのリンクされたIDと@user = current_user以外のリダイレクトされるプライベート関数に@userの変数を代入してインスタンス化することだと思いますが、これを行うと毎回リダイレクト動作が発生しますユーザーがレコードを所有している場合)。ここで Railsのリンクテーブルフィールドに基づいてインスタンス変数を割り当てます。

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でセットアップされているため、これらのヘルパーはまた利用可能です。あなただけcurrent_user

@user == current_user 

@userを比較したい

答えて

1

使用==の代わり===はまた、あなたが

012に

@user = User.where(params[:id] === @deal.user_id) 

を変更する必要があり、ここで=== vs. == in Ruby

を違いを参照してください。

+0

これはありがとうございます! – oneWorkingHeadphone

0

オクラホマので、どこから始めれば...

まず第一には、代わりに==を使用し、レコードを比較すること===を使用しないでください。第二に

def edit 
    @deal = Deal.find(params[:id]) 
    @user = User.find_by(params[:id]: @deal.user_id) 
    correct_user 
end 

ユーザーを検索しようとすると、あなたの代わりに、ブールパラメータを、ハッシュとしてARオプションを提供する必要があります。レコードが見つからないときに例外を発生させる場合は、findを使用するか、単純にnilを返す場合はfind_byを使用してください。

correct_userでは、===の代わりに==を再度使用します。

しかし、このコードはそれほどきれいではなく、リファクタリングを使用することもできます)

関連する問題