2016-06-13 8 views
0

私の請求作成のアクションで次のエラーが発生しています。 エラー:未定義のメソッド `shop 'for Nil:NilClass作成アクションでUser.lastとUser.find_by_id(params [:user_id])の違いは何ですか?

このアクションは、ユーザー「ショップ」ページでストライプを使用して新しい請求を作成するためのものです。

私のモデルの関係は以下の通りです。

ユーザーhas_oneのショップ、ユーザーbelongs_toの ショップ、 ショップにhas_many料、私は以下の料金コントローラからアクションを作成するコードが含まれているショップ

BELONGS_TO 充電。 User.last.shop.charges.build(charge_params)のようなものがないとき

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 

なぜその構文は、ユーザを識別するために動作しませんか?

興味深いことに、showアクションの行User.find_by_id(params [:user_id])はうまく動作します。

答えて

0

@user = User.find_by_id(params[:user_id])の代わりに@user = User.find(params[:user_id])または@user = User.find_by!(id: params[:user_id])を使用してください。これによりActiveRecord::RecordNotFoundエラーが発生し、最終的に404ページにリダイレクトされます。

find_by_*のようなファインダメソッドは、Rails 4では推奨されず、activerecord-deprecated_findersに抽出されました。 Rails 3以下のバージョンを使用していることを確認してください。

+0

を使用することができ、私はこれらの提案の両方を試してみましたが、どちらも動作するように見えません。 User.find_by(params [:user_id])は、料金を通過させる(エラーなし)が、URLに定義されたユーザーがユーザー1ではないにもかかわらず、ユーザー番号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ヘルパーメソッド

+0

あなたの助けに感謝します! – blippolis

関連する問題