如何解决 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]
更新:
这是一个很大的禁忌,不能用相同的动作处理两个不同的动词。在极少数情况下才有意义。
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]
更新:
这是一个很大的禁忌,不能用相同的动作处理两个不同的动词。在极少数情况下才有意义。