我很新,已经搜索过,找不到这个问题。希望有人可以帮助我。
根据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动作出现问题?
答案 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。