创建操作中User.last和User.find_by_id(params [:user_id])之间有什么区别?

时间:2016-06-13 20:50:24

标签: ruby-on-rails

我的收费创建操作收到以下错误。 错误:未定义的方法`shop'为零:NilClass

此操作旨在使用条带在用户" shop"上创建新的费用。页。

我的模型关系如下。

用户has_one商店, 店铺belongs_to用户, 商店has_many费用, 费用belongs_to商店

我已经在下面的费用控制器中添加了创建操作代码。

def create
    @user = User.find_by_id(params[:user_id])
    @shop = @user.shop
    @charge = @shop.charges.build(charge_params)

    if @charge.save
        redirect_to root_path
    else
        flash[:danger] = "Error"
        redirect_to root_path
    end
end

为什么识别用户的语法在User.last.shop.charges.build(charge_params)之类的内容时不起作用?

有趣的是,在show动作中,User.find_by_id(params [:user_id])行正常工作。

2 个答案:

答案 0 :(得分:0)

使用@user = User.find(params[:user_id])@user = User.find_by!(id: params[:user_id])代替@user = User.find_by_id(params[:user_id])。这会引发ActiveRecord::RecordNotFound错误,最终会重定向到404页面。

find_by_*这样的Finder方法在Rails 4中已弃用,并被解压缩到gem activerecord-deprecated_finders。确保您使用的是Rails 3或更低版本。

答案 1 :(得分:0)

User.last返回数据库中的最后一条记录。它失败的唯一方法就是根本没有记录。

use_by_id版本会尝试在数据库中查找特定记录,如果没有此id的记录,则可能会失败。你必须处理这样的失败。

在此类应用程序中,您可能希望处理current_user(当前登录的用户),您可以使用devise辅助方法