2017-02-26 65 views
0

爲什麼我在提交表單時出現此錯誤?我不是已經建立了ID嗎?提交form_for時路由參數不可用?

ActiveRecord::RecordNotFound at /polls/:poll_id/responses 
Couldn't find Poll with 'id'= 

在我的Polls_Controller我讓所有表單輸入訪問。 poll_id來自路由參數,顯示路由成功響應:id

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,但是,當我提交表單,它看起來像Rails的將無法訪問該PARAM因爲路由變化。

#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,只有:[:show]' – rogelio

回答

1

這裏有一些問題出在這裏。

首先,你url: '/polls/:poll_id/responses/'選項的形式意味着表單將使用字面路線/polls/:poll_id/responses/提交表單時,form_for不明白,你希望它與任何更換:poll_id所以它贏得了」噸。

接下來,當您rake routes時,路線應該顯示爲/polls/:id/responses,因此路線本身可能在routes.rb中被錯誤地定義。你應該routes.rb看起來更像是這樣的:

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

這會給你喜歡/polls/:id/response的路線,你就可以到你的set_poll控制器回調連接到responses路線了。現在,當你rake routes你應該看到:

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

有你的形式responses_poll_path URL幫手:從您的形式

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

爲投票的:

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

您也可以刪除id現在在它所屬的路線中。

隨着上述變化,您的表格將張貼到正確的控制器params[:id]中,該控制器將識別有問題的投票,並且@poll將在您的responses控制器內正確。

現在,你有途徑和形式設置正確,你的控制變得更加簡單:

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

@poll.responses協會應提供調查的id自動(如果你有一個has_many :responses裏面當然app/models/poll.rb)。

+0

非常感謝!我已經三重檢查了你的指示。我應該注意到我的回答模式是「PollResponse」。如果我運行 '''@poll_response = @ poll.responses.create( params.require(:poll_response).permit(:poll_option_id,:IP_ADDRESS) )''' 我得到以下錯誤: ''' NoMethodError at/polls/11/responses' 未定義的方法'response''' – HashRocketSyntax

+0

那麼你的'app/models/poll.rb'中沒有'has_many:responses'呢? –

+0

我有'has_many:poll_responses,dependent :: destroy'。我試着運行'@ poll.poll_responses.create(',但是當我嘗試時忘記刷新我的db ui,現在可以工作=) – HashRocketSyntax