【问题标题】:Route params not available when submitting form_for?提交form_for时路由参数不可用?
【发布时间】:2017-02-26 19:10:53
【问题描述】:

为什么我在提交表单时收到此错误?我不是已经建立了id吗?

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

在我的Polls_Controller 中,我正在使所有表单输入都可以访问。 poll_id来自路由参数,show路由成功响应: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 似乎因为路由更改而无法访问该参数。

#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

【问题讨论】:

  • 你在哪里打电话给set_poll?也许before_action set_poll, only: [:show]

标签: ruby-on-rails forms routes erb form-for


【解决方案1】:

这里有一些问题。

首先,表单的url: '/polls/:poll_id/responses/' 选项意味着表单在提交表单时将使用文字路由/polls/:poll_id/responses/form_for 不明白您希望它替换@987654324 @ 任何东西,所以它不会。

接下来,当您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 助手:

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

您也可以删除:

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

来自您的表单,因为投票的 id 现在位于它所属的路线中。

通过上述更改,您的表单将发布到正确的控制器,该控制器中的 params[:id] 将识别有问题的投票,而 @poll 将是您的 responses 控制器中的正确内容。

现在您已经正确设置了路线和表单,您的控制器变得非常简单:

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

@poll.responses 关联应该自动提供投票的id(当然,如果你在app/models/poll.rb 中有has_many :responses)。

【讨论】:

  • 非常感谢!我已经三次检查了你的指示。我应该注意我的响应模型是PollResponse。如果我运行@poll_response = @poll.responses.create( params.require(:poll_response).permit(:poll_option_id, :ip_address) ),我会收到以下错误:NoMethodError at /polls/11/responses` undefined method `responses'
  • 那么你的app/models/poll.rb 中没有has_many :responses 吗?
  • 我有一个has_many :poll_responses, dependent: :destroy。我尝试运行@poll.poll_responses.create(,但在尝试时忘记刷新我的数据库用户界面。现在有效 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2014-03-26
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多