2017-02-26 15 views
0

フォームの送信時にこのエラーが発生するのはなぜですか?私はすでにIDを確立していないのですか?form_forを送信するときにルートパラメータを使用できませんか?

私のPolls_Controllerでは、すべてのフォーム入力をアクセス可能にしています。 poll_idはルートのparamから来て、showルートは:idに正常に応答します。私は自分のフォームを送信するときRailsはルート変更理由はそのPARAMへのアクセスを失うよう

def show 
    @poll_options = @poll.options 

    # since you can respond to a poll from its show route 
    @poll_response = PollResponse.new 
end 

def responses 
    @poll_response = PollResponse.create(
    params.require(:poll_response).permit(:poll_option_id, :ip_address, :poll_id) 
) 
    if @poll_response.save 
    redirect_to "/welcome" 
    else 
    end 
end 

private 

def set_poll 
    @poll = Poll.find(params[:id]) 
end 

マイビューの表示が正常に読み込ま/polls/:idで、しかし、それが見えます。

#Poll/Show.html.erb 
<%= form_for(@poll_response, url: '/polls/:poll_id/responses/') do |f| %> 

    <%= f.hidden_field(:ip_address, value: request.remote_ip) %> 
    <%= f.hidden_field(:poll_id, value: @poll.id) %> 
    <ul> 
    <% @poll_options.each do |option_id, option_value| %> 
     <li> 
     <%= f.radio_button(:poll_option_id, option_id) %> 
     <%= option_value %> </br> 
     </li> 
    <% end %> 
    </ul> 
    <%= f.submit "Vote!" %> 

<% end %> 

ここに私のルートがあります。 Poll_ResponseとPoll_OptionモデルはPollに属します。

resources :polls, only: [:show, :create, :index, :responses] do 
    post 'responses', as: :responses 
end 
+0

あなたは 'set_poll'をどこかで呼びますか?多分 'before_action set_poll、only:[:show]' – rogelio

答えて

1

ここで間違ったことがいくつかあります。

まず、フォームにごurl: '/polls/:poll_id/responses/'オプションは、「フォームがフォームを送信する際、form_forあなたはそれが勝ったので、それが何で:poll_idを置き換えるために期待していることを理解していないリテラルルート/polls/:poll_id/responses/を使用することを意味しますt。

rake routesの場合、経路は/polls/:id/responsesと表示されるため、経路自体がおそらくroutes.rbで正しく定義されていません。あなたのroutes.rbはより次のようになります。あなたの/polls/:id/responseのようなルートを与えるだろうし、あなたもresponsesルートにごset_pollコントローラのコールバックを添付することができるでしょう

resources :polls, only: [:show, :create, :index, :responses] do 
    member do 
    post :responses 
    end 
end 

。今、あなたは rake routesあなたが見る必要がある場合: responses_poll_path URLのヘルパーは、フォームのためにあります

responses_poll POST /polls/:id/responses(.:format) polls#responses 

<%= form_for(@poll_response, url: responses_poll_path(@poll) do |f| %> 

また、ドロップすることができます。

<%= f.hidden_field(:poll_id, value: @poll.id) %> 

フォームからアンケートのようidは現在、それが属するルートにあります。

上記の変更を行うと、あなたのフォームはコントローラのparams[:id]に投稿され、@pollはコントローラのresponsesコントローラ内に適切に表示されます。

は今、あなたがルートを持っており、適切に設定形成していることが、あなたのコントローラがずっと簡単になる:(あなたはもちろんのapp/models/poll.rbhas_many :responsesを持っている場合)

@poll_response = @poll.responses.create(
    params.require(:poll_response).permit(:poll_option_id, :ip_address) 
) 

@poll.responses協会は世論調査のid自動的に提供する必要があります。

+0

本当にありがとう!私はあなたの指示を三重チェックしました。私の回答モデルは 'PollResponse'です。 (:poll_response).permit(: params.require(poll_option_id、:IP_ADDRESS) )私は '' '@poll_response = @ poll.responses.create を実行する場合は、' '' を私は次のエラーを取得する: '' ' NoMethodError at/polls/11/responses' 未定義のメソッド 'responses '' '' – HashRocketSyntax

+0

あなたの 'app/models/poll.rb'に' has_many:responses'がありません。 –

+0

私は 'has_many:poll_responses、dependent::destroy'を持っています。私は '@ poll.poll_responses.create('を実行しようとしましたが、試みたときにdbを更新するのを忘れてしまいました。 – HashRocketSyntax

関連する問題