【问题标题】:Routing error with forms for nested resources嵌套资源表单的路由错误
【发布时间】:2015-07-26 14:56:24
【问题描述】:

我有一个rounds 资源嵌套在cases 资源中,所以我的routes.rb 文件如下所示:

resources :cases do
  resources :rounds
end

我在控制器中的create 操作如下所示:

def create
  @round = Round.new(round_params)
  if @round.save
    flash[:success] = "Round added"
    redirect_to case_path(id: @round.case_id)
  else
    render 'new'
  end
end

我的_round_form.html.erb 视图如下所示:

<%= form_for [@case, @round] do |f| %>
    <%= render 'shared/error_messages', object: @round %>

    ...

    <%= f.submit "Submit", class: "btn btn-primary form-button case-button" %>
<% end %>

由于某种原因,当我正确创建一个回合时,它可以工作,但是当我提交一个有错误的回合时,它没有呈现错误消息,而是给了我这个错误:

undefined method rounds_path' for #<#<Class:0xc8b7508>:0xc8b6da0>

为什么会这样?它不应该寻找new_case_round_path,而不是rounds_path吗?

新的行动,如果有帮助的话:

def new
  id = params[:case_id]
  unless id
    flash[:danger] = "You must pick a case before trying to log a round"
    redirect_to 'pick_case'
  end
  @case = Case.find(id)
  @side_options = @case.sides.map { |s| [s.name, s.id] }
  @round = Round.new
end

【问题讨论】:

  • 您的@case 为零。您在哪个视图页面/操作中调用_round_form.html.erb
  • 我在new.html.erb中渲染round_form
  • 你是怎么得到params[:case_id]的?
  • 刚刚意识到我的错误,你是对的,我使用 params[:case_id] 来修复它。我会将更改发布为答案

标签: ruby-on-rails


【解决方案1】:

问题是我的@case 为零,所以我将@case = Case.find(params[:case_id]) 添加到我的创建操作的 else 分支中

【讨论】:

  • 太棒了!我完全错过了提交错误表单的意义。
【解决方案2】:

希望你有@case 值,试试这个:

<%= form_for([@case, @round]) do |f| %>
  <%= render 'shared/error_messages', object: @round %>
  ...

  <%= f.submit "Submit", class: "btn btn-primary form-button case-button" %>
<% end %>

更新

def new
  @side_options = @case.sides.map { |s| [s.name, s.id] }
  @round = @case.rounds.new
end

private

def set_case
   @case = Case.find(params[:case_id])
end

【讨论】:

  • 我在提交表单时有@case 值,但由于它路由到错误的路径,它不会有@case 值,对吗?我在原始帖子中添加了我的new 操作,如果这有帮助的话。
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多