2016-03-31 11 views
1

私のゲームの日付コントローラでfind_or_createメソッドを使いたいです。 paramsがgame_date_paramsにあるときに、作成アクションでそのメソッドを使用する方法がわかりません。任意の提案game_date_paramsから日付を抽出するにはどうすればよいですか?作成アクションでfind_or_createを使用するには?

class GameDatesController < ApplicationController 
    before_action :authenticate_user! 
    before_action :authenticate_admin 

    def index 
    @game_dates = GameDate.all 
    @showcases = Showcase.joins(:game_dates) 
    end 

    def new 
    @game_date = GameDate.new 
    @game_date.referee_stats.build 
    end 

    def create 
    @game_date = GameDate.new(game_date_params) 
    if @game_date.save 
     redirect_to showcases_path 
     flash[:success] = "Game date created" 
    else 
     render 'new' 
    end 
    end 

    def show 
    @game_date = GameDate.find(params[:id]) 
    end 

    def destroy 
    @game_date = GameDate.find(params[:id]).destroy 
    redirect_to root_url 
    flash[:success] = "Game date deleted" 
    end 


    private 

    def game_date_params 
    params.require(:game_date).permit(:date, referee_stats_attributes: [ :games_count, :showcase_id ]) 
    end 

これは、POSTアクションからの出力です:

Started POST "/game_dates" for 127.0.0.1 at 2016-04-01 10:21:44 +0200 Processing by GameDatesController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"jmuOmMCO/WTFIkxrsw5l2cPVMqZAl7h11f281I+OyoHH3ddwKoB9ANAqvQEHulR88c7fzQXnnIaxs8FChMCjqw==", "game_date"=>{"date(1i)"=>"2016", "date(2i)"=>"4", "date(3i)"=>"1", "referee_stats_attributes"=>{"0"=>{"games_count"=>"4", "showcase_id"=>"1"}}}, "commit"=>"Create Game date"} User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] GameDate Load (0.4ms) SELECT "game_dates".* FROM "game_dates" WHERE "game_dates"."date" IS NULL LIMIT 1 (0.2ms) BEGIN SQL (0.4ms) INSERT INTO "game_dates" ("date", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["date", "2016-04-01"], ["created_at", "2016-04-01 08:21:44.864669"], ["updated_at", "2016-04-01 08:21:44.864669"]] SQL (0.4ms) INSERT INTO "referee_stats" ("games_count", "showcase_id", "game_date_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["games_count", 4], ["showcase_id", 1], ["game_date_id", 7], ["created_at", "2016-04-01 08:21:44.866897"], ["updated_at", "2016-04-01 08:21:44.866897"]] (18.1ms) COMMIT Redirected to http://localhost:3000/showcases Completed 302 Found in 31ms (ActiveRecord: 20.1ms)

答えて

1

GameDate.find_or_create_by(game_date_params)は、ALLgame_date_paramsでレコードを見つけるだろう。例えば:

def create 
    # find or initialize the record 
    @game_date = GameDate.find_or_initalize_by(date: game_date_params[:date]) do |game_date| 
    # Accept nested attributes as well 
    game_date.assign_attributes(game_date_params) 
    end 

    if @game_date.save 
    redirect_to showcases_path 
    flash[:success] = "Game date created" 
    else 
    render 'new' 
    end 
end 

も参照してください:find_or_create_byAttributesAssignment APIドキュメント

+0

これはうまく動作しますが、そうではありません。私が思ったように。選択した日付のゲームの日付がデータベースに入っている場合でも、新しいゲームの日付が作成されます。 – Nekron

+0

本当に!これは '@game_date = GameDate.find_by(date:game_date_params [:date])のように動作します。 GameDate.new(日付:@game_date_params [:date]) '。たぶんあなたの日付形式に何か問題があります。 game_date_params [:date]を印刷して手動で検索して、何が起きているのかを確認できますか? – abookyun

+0

読みやすくするために、私の質問にPOSTアクションの出力を追加しました。意外にも、あなたのコメントから作成アクションのコードを変更したとしても、同じ日付のゲーム日付が節約されています。デバッグコンソールの属性:raw_attributes: date:2016-04-01 id: '8' created_at:&1 2016-04-01 08:50:37.664718353 Z updated_at:* 1 – Nekron

1

それは次のようにする必要があります:アクションを作成

def create 
    @game_date = GameDate.find_or_create_by(game_date_params) 
    if @game_date.present? 
     redirect_to showcases_path 
     flash[:success] = "Game date created" 
    else 
     render 'new' 
    end 
end 
+0

を私はこれを試してみた、そしてこれは、コンソールから出力されます。 "#<クラス:0x007f8e83018718>のための未定義のメソッド' find_or_create」" – Nekron

+0

答えを今すぐ修正されたチェック。 –

+0

別のエラー:PG :: UndefinedColumn:ERROR:列game_dates.date(1i)が存在しませんLINE 1:SELECT "game_dates"。* FROM "game_dates" WHERE "game_dates" .... ^:SELECT "game_dates"。* "date(2i)" = "3" AND "game_dates"。 "date(3i)" = "31" AND "game_dates"から "date(1i)" = "2016" AND "game_dates" "0" = '---!ruby/hash:ActionController :: Parameters games_count:' '2' 'showcase_id:' '1' '' LIMIT 1 – Nekron

0

新しいアクションが呼ばれると、更新操作された後にオブジェクトを作成するためのものです同じ場合でも編集する場合。ミキシングは&更新ロジックを作成することをお勧めします。たぶんあなたはあなたの意見に何をしようとしているのか考え直すべきでしょう。あなたはdateのような特定のparamsを見つけることによってこれを行うと、ブロックを経由して、それに残りの属性を割り当てることができるように

関連する問題