我的收费创建操作收到以下错误。 错误:未定义的方法`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])行正常工作。
答案 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
辅助方法