2017-02-26 38 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