2016-06-13 37 views
0

我收到以下错误我的费用创建操作。 错误:未定义的方法`商店'为零:NilClass创建操作中User.last和User.find_by_id(params [:user_id])有什么区别?

此操作旨在使用用户“商店”页面上的条带创建新的费用。

我的模型关系如下。

用户HAS_ONE店, 店belongs_to的用户, 店的has_many费, 充电belongs_to的店

我已经包括从下面的收费控制器的create动作代码。

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 action中,User.find_by_id(params [:user_id])工作正常。

回答

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_*这样的查找方法在Rails 4中被弃用,并被提取到gem activerecord-deprecated_finders。确保你使用的是Rails 3或更低版本。

+0

我都尝试这些建议既不似乎工作。 User.find_by(params [:user_id])允许费用通过(无错误),但它会自动为用户1创建费用,即使在url中定义的用户不是用户1也是如此。来自(哪里? – blippolis

+0

使用'User.find(params [:user_id])'或'User.find_by!(id:params [:user_id])''。它应该引发'ActiveRecord :: RecordNotFound'错误。 – Omkar

0

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

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

在这种应用中,你可能要应对current_user(当前登录的用户),以便您可以使用devise helper方法

+0

非常感谢您的帮助! – blippolis

相关问题