0

私はかなり新しく、検索しましたが、この問題を見つけることができませんでした。誰かが私を助けてくれることを願っています。

Ruby on Rails チュートリアルに従って、 correct_user というセッション ヘルパーがあります。私はもともと users_controller にそれを持っていましたが、自分の users_controller だけでなく timesheets_controller (ユーザーが毎日の時間を入力するときに使用する) でも before フィルターを使用したいので、セッションヘルパーに移動しました。

これが私のセッションヘルパーです:

def correct_user
    @user = User.find(params[:id])
    unless current_user?(@user)
        redirect_to(root_url)
    end  
 end

私の timesheets_controller.rb の関連部分は次のとおりです。

before_filter :correct_user, only: [:show, :create]

def new
end

def show
    @timesheet = Timesheet.new
    @timesheets = Timesheet.paginate(page: params[:page], per_page: 10)
end

def index
    @timesheets = Timesheet.paginate(page: params[:page], per_page: 10)
end

def create
    @timesheet = current_user.timesheets.create(params[:timesheet])
    if @timesheet.save
       @timesheet.approved = false
       @timesheet.save
       flash[:success] = "Timesheet Entered!"
       redirect_to current_user
    else
      render 'show'
    end
end

何らかの理由で、ショーは完全に正常に動作しますが、作成によりエラーがスローされます。

ActiveRecord::RecordNotFound in TimesheetsController#create

Couldn't find User without an ID
Rails.root: /Users/vinaymal/Documents/Vinay/Coding/rails_projects/SSSERP

Application Trace | Framework Trace | Full Trace
app/helpers/sessions_helper.rb:46:in `correct_user'

46 行目は次のとおりです。

@user = User.find(params[:id])

正しいユーザーを選択するようにこれを変更するにはどうすればよいですか。show アクションで問題が発生しないのはなぜですか?

4

2 に答える 2

1

User操作のコンテキストで使用される場合params[:id]id、ユーザーの です。ただし、Timesheet操作のコンテキストでparams[:id]id、タイムシートの、またはnil作成操作の場合です。

タイムシートの場合、それ以外のすべての操作についてチェックしたいのは、タイムシートを作成したユーザーと同じであるというcreateことです。current_user

于 2013-08-14T22:01:21.167 に答える
0

残念ながら、@user = User.find(params[:id])どちらのアクションでも正しく機能しないと思います。それは偽陽性です。

たまたま、表示しているタイムシートと同じ ID を持つユーザーがいる可能性があります1

ヘルパーを次のように変更します。

User.find(session[:user_id])

ログイン時に、セッションハッシュにユーザーIDを次のように保存しますuser_id

session[:user_id] = @current_user.id

セッションの理解を深める必要がある場合は、こちらのガイドをご覧ください。

于 2013-08-14T22:05:05.923 に答える