【问题标题】:Rails form - multiple nested routes undefined method '_path'Rails 表单 - 多个嵌套路由未定义方法'_path'
【发布时间】:2017-10-02 01:01:41
【问题描述】:

此应用有以下型号:

  1. 农场(has_many :crops)
  2. 作物(belongs_to :farm, has_many :issues)
  3. 问题(belongs_to :crop)

路线如下:

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

我希望用户能够从 Farm#show 页面创建一个新的“问题”,该页面列出了农场的所有作物。这是导致 Farm#show 页面出现错误的表单:

# 的未定义方法“crop_issues_path”>

#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

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

【问题讨论】:

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


    【解决方案1】:

    我认为您的问题在于您将表单绑定到的对象。它应该是@farm,因为您在@farms 显示操作中。

    我修改成这样:

    <% @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
    

    【讨论】:

    • 在 form_for 中添加“@farm”似乎是解决问题的方法!不熟悉“@farm.try(:crops)”以及它与“@farm.crops”的不同之处 - 有什么区别?
    • 对不起,那是我的懒惰 - 不想在我的数据库中添加作物来测试场景,所以我添加了 .try() 所以它不会因为空值而爆炸@crops
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2012-12-02
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多