在控制器中过滤之前使用correct_user给我一个错误

时间:2013-08-14 21:55:15

标签: ruby-on-rails ruby

我很新,已经搜索过,找不到这个问题。希望有人可以帮助我。

根据Ruby on Rails教程,我有一个名为correct_user的会话助手。我最初在我的users_controller中使用了它,但是将其移动到会话助手,因为我想在我的users_controller中使用before过滤器,而且还在我的timesheets_controller(我在用户输入每日时间时使用)中使用过滤器

这是我的会话助手:

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动作出现问题?

2 个答案:

答案 0 :(得分:0)

User操作的上下文中使用时,params[:id]是用户的id。但是,在Timesheet操作的上下文中,params[:id]是时间表的id,或者是创建操作时的nil

对于时间表,您要检查的所有操作其他而不是create的是current_user与创建该时间的用户相同时间表。

答案 1 :(得分:0)

不幸的是,我认为@user = User.find(params[:id])无法正常执行任何操作;这是假阳性。

恰好您的用户ID与您正在查看的时间表具有相同的ID,可能是1

我会将你的助手改为:

User.find(session[:user_id])

并在登录时将会话哈希中的用户ID存储为user_id,例如:

session[:user_id] = @current_user.id

如果您需要更好地了解会话,请查看指南here