如何解决 Rails 中的歧义错误?未定义的方法“_index_path”

How to resolve ambiguity error in Rails? Undefined method '_index_path'

Rails 公约敦促大家按照现实生活中的命名方式命名模型、控制器和其他事物。

我 运行 遇到了一个问题,我的表单无法识别实例变量的正确形式。

我有 Fish 模型和相应的 fish 控制器。

class FishController < ApplicationController
  def index
    @fish = Fish.new
  end
end

然后当我进入我的表格时,我得到了错误。

<%= form_for @fish do |f| %>
  <%= f.label :type %>
  <%= f.text_field :type, class: "form-control" %>
<% end %>

我正在使用 Rails 4.2.5.

这是我的 routes.rb。

Rails.application.routes.draw do
  root 'fish#index'

  get 'fish' => 'fish#index'
  post 'fish' => 'fish#index'
end

我该如何解决这个问题?提前致谢。

您应该为您的用例使用常规操作。创建一个新对象应该发生在控制器的 create 动作中,例如

def create
  @fish = Fish.create(fish_params)
  redirect_to index_path
end

form_for 当给定资源时,尝试构建默认名称 url_helper 如果您使用 rails 方式并在路由中为该模型添加资源,则会创建该名称.由于fish的复数形式仍然是fish,所以帮手的名字是fish_index_path

显然,这只是惯例,所有这些东西都可以轻松更改。你有几个选择。

首先是将 url 选项添加到您的 form_for:

<%= form_for @fish, url: '/fish' do |f| %>

当您稍后决定更改路线时,这可能会很痛苦,因为它很容易忘记。

其他选项是为您的路线命名:

get 'fish' => 'fish#index', as: :fish_index

另一种是按照约定创建资源:

 resources :fish, only: [:index, :create]

更新:

这是一个很大的禁忌,不能用相同的动作处理两个不同的动词。在极少数情况下才有意义。