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

时间:2016-02-20 12:54:51

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

Rails惯例敦促每个人按照现实生活中命名的方式命名模型,控制器和其他东西。

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

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

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

enter image description here

我使用 Rails 4.2.5

这是我的routes.rb。

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

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

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

2 个答案:

答案 0 :(得分:1)

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]

更新:

使用相同的动作来处理两个不同的动词是一个很大的禁忌。在有意义的情况下,非常罕见。

答案 1 :(得分:0)

您应该针对您的用例使用传统操作。创建新对象应该在控制器的create动作中发生,例如

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