0

私は自分のレールアプリケーションにフォームを作成しています。ここでユーザーは単に番号を入力し、フォームはajaxで送信されます。すべてのパラメータが存在すれば、ゲームコントローラに新しいゲームが作成されます。私は非常にうまくコントローラに渡すパラメータが2つのhidden_​​field_tagsを持っていますが、最も重要なパラメータは、ユーザー入力から取得したものは、コントローラに渡すように見えません。Railsリモートフォームのパラメータがコントローラに渡されていない

マイ形式:

<%= form_for @game, :url => {:controller => "games", :action => "create" }, :html => { :role => 'form' }, remote: true, method: :post do |f| %> 
    <div class="row"> 
    <div class="col-md-4 col-md-offset-4"> 
     <div class="input-group"> 
     <%= f.text_field :user_stake, class: 'form-control' %> 
     <span class="input-group-btn"> 
      <%= f.submit 'Go', :html => { :type => "button" }, class: "btn btn-default" %> 
     </span> 
     </div> 
    </div> 
    </div> 

    <%= hidden_field_tag 'user_id', current_user.id %> 
    <%= hidden_field_tag 'jackpot_id', @jackpot.id %> 

<% end %> 

コントローラー:

がどんなに@gameで入力された私は、私の移行にデフォルトとして設定されている0.0のuser_stake、で保存されていませんます。私はここで何が間違っているのか分かりません。何か案は?ありがとう!

+0

現時点では、フォームを送信するためのレールサーバーのヒントはありますか? –

+0

'before_action:game_params、only:[:create]'を削除します。それは無駄な時間/記憶を除いて全く何もしません。 – max

+0

DB列タイプとは何ですか? – max

答えて

2

あなたは適切に入力を入れ子にしていない:

<%= form_for @game, html: { role: 'form' }, remote: true %> 
    <%= f.text_field :user_stake, class: 'form-control' %> 
    <%= hidden_field_tag 'user_id', current_user.id %> 
    <%= hidden_field_tag 'jackpot_id', @jackpot.id %> 
    # .. 
<% end %> 

これは、次のparamsハッシュを与える:

{ 
    game: { 
    user_stake: 1.2 
    }, 
    user_id: 3, 
    jackpot_id: 4 
} 

ホワイトリストに送信すると、次のようになります。

{ 
    user_id: 3, 
    jackpot_id: 4 
} 

<%= form_for @game, html: { role: 'form' }, remote: true %> 
    <%= f.text_field :user_stake, class: 'form-control' %> 
    <%= f.hidden_field_tag 'user_id', current_user.id %> 
    <%= f.hidden_field_tag 'jackpot_id', @jackpot.id %> 
    # .. 
<% end %> 

し、適切にそれらをホワイトリスト: - NEVERはのparamsを通じて、現在のユーザーIDを渡す

private 
    def game_params 
    params.require(:game) 
      .permit(:user_stake, :user_id, :jackpot_id) 
    end 

をしかし、ここで巨大な警告フラグがあるソリューションに

は、単に巣の入力であります悪意のあるユーザーがWebインスペクタだけでハックするのはとても簡単です。代わりに、セッションから直接値を使用します。

ユーザーのパスワードを除いて、またはアプリケーションの秘密を知ること以外は、偽造することはできません。

ゲームがジャックポットに属している場合は、nested resourceとして設定し、パスにIDを設定すると、親リソースに子を追加していることを明確に示すRESTful構造が作成されますリクエスト本体の重要な情報

# routes.rb 
resources :jackpots do 
    resources :games, shallow: true 
end 

class GamesController 
    before_action :set_jackpot, only: [:new, :create, :index] 

    # GET /jackpots/:jackpot_id/games/new 
    def new 
    @game = @jackpot.games.new 
    end 

    # POST /jackpots/:jackpot_id/games 
    def create 
    @game = @jackpot.games.new(game_params) do |g| 
     g.user = current_user 
    end 

    if @game.save 
     # ... 
    else 
     # ... 
    end 
    end 

    # GET /jackpots/:jackpot_id/games 
    def index 
    @games = @jackpot.games 
    end 

    private 

    def set_jackpot 
     @jackpot = Jackpot.includes(:games) 
         .find(params[:jackpot_id]) 
    end 

    def game_params 
     params.require(:game).permit(:user_stake) 
    end 
end 

<%= form_for [@jackpot, @game], remote: true, html: { role: 'Form' } do |f| %> 
    <div class="row"> 
    <div class="col-md-4 col-md-offset-4"> 
     <div class="input-group"> 
     <%= f.number_field :user_stake, class: 'form-control' %> 
     <span class="input-group-btn"> 
      <%= f.submit 'Go', :html => { :type => "button" }, class: "btn btn-default" %> 
     </span> 
     </div> 
    </div> 
    </div> 
<% end %> 

必要隠れ入力がないか注意してください。

+0

ありがとう、これは非常に包括的で有用な答えです。私はあなたが提案したことをやったが、今はすべてが完璧に動作しているようだ。ちょうど1つの質問:ゲームはジャックポットに属していないので、あなたが言ったようなルートを維持すべきかどうか疑問に思っている。むしろ私はUser has_many:jackpots、=>ゲームを持つ多対多の関連を設定している。あなたが言ったようなルートを維持するか、それらを変更する必要がありますか?ありがとう – RT5754

+0

その場合、大当たりとゲームの間にbelongs_toの関連があります。 – max

+0

オクラホル、ありがとう – RT5754

2

コントローラのcreateメソッドに何が投稿されているかを確認するには、サーバーログを調べることができます。私は、ゲームのパラメータがgameハッシュでカプセル化されていると考えます。それにアクセスするには、私はゲームを必要とするgame_paramsを変更することはお勧めしたい:

def game_params 
    params.require(:game).permit(:user_stake, :user_id, :jackpot_id) 
end 
+0

あなたの答えをありがとう。フォームの提出時に、ログに次のように表示されます:INSERT INTO "games"( "user_id"、 "jackpot_id"、 "created_at"、 "updated_at")。 user_stakeは存在しません。ちょうど私がゲームではなくuser_stakeを渡そうとしていることを明確にする。ゲームは私のモデルです – RT5754

+0

はい...あなたのgame_paramsがあなたのパラメータを除外しているかもしれません。 'game_params'と' params'の結果を調べることをお勧めします。これは、データがフィルタリングされている場所を診断するのに役立ちます。 'byebug '(http://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-byebug-gem)を' create'メソッドの先頭に置くと、これらの変数を調べるのに役立ちます。 –

関連する問題