Rails表单 - 多个嵌套路由未定义方法' _path'

时间:2017-10-02 01:01:41

标签: ruby-on-rails forms nested-resources

此应用有以下型号:

  1. 农场(has_many:crop)
  2. 裁剪(belongs_to:farm,has_many:issues)
  3. 问题(belongs_to:crop)
  4. 以下是路线:

    resources :farms do 
      resources :crops do 
        resources :issues
      end 
    end
    

    我希望用户能够创建一个新问题"来自Farm#show页面,其中列出了所有农场作物。以下是导致农场#show页面错误的表单:

      

    未定义的方法`crop_issues_path'对于#<#:0x007fa814a3cc30>

    #from the show action on the controller:
    #@farm = Farm.find(params[:id])
    #@crops = @farm.crops
    
    <% @crops.each do |crop| %>
    <%= crop.id %>
      <%= form_for([crop, crop.issues.build]) do |f| %>
        <%= f.select(:issue_type, options_for_select([['mold'], ['pests'], ['dehydration'], ['other']])) %>
        <%= f.text_area :notes %><br>
        <%= f.submit "New Issue", :class => "button" %>
      <% end %> 
    <% end %>
    

    我对问题控制器的创建操作:

      def create
        @crop = Crop.find(params[:crop_id])
        @issues = @crop.issues.create(params[:issue].permit(:issue_type, :notes, :crop_id))
    
        redirect_to :back
      end
    

    当作物和问题没有嵌套在农场之下时,我使用了几乎相同的代码,并且它有效。我认为这个问题是因为嵌套,但无法找到解决方案。

1 个答案:

答案 0 :(得分:1)

我认为你的问题在于你正在将表格绑定到的对象。它应该是@farm,因为你正在@farms show action。

我将其修改为:

<% @crops.each do |crop| %>
<%= crop.id %>
  <%= form_for([@farm, crop, crop.issues.build]) do |f| %>
    <%= f.text_area :notes %><br>
    <%= f.submit "New Issue", :class => "button" %>
  <% end %> 
<% end %>

我的控制器是这样的:

class FarmsController < ApplicationController
  def index
  end

  def show
    @farm = Farm.find_by_id(params[:id])
    @crops = @farm.try(:crops)
  end
end