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])

我该如何修改它以便它选择正确的用户。为什么它不会对表演动作造成问题?

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])这两种操作都不能正常工作;这是一个误报。

碰巧您有一个与您正在查看的 Timesheet 具有相同 ID 的用户,可能是1.

我会将您的助手更改为:

User.find(session[:user_id])

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

session[:user_id] = @current_user.id

如果您需要更好地了解 Sessions,请查看此处的指南。

于 2013-08-14T22:05:05.923 回答