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 %>
我使用 Rails 4.2.5 。
这是我的routes.rb。
Rails.application.routes.draw do
root 'fish#index'
get 'fish' => 'fish#index'
post 'fish' => 'fish#index'
end
我该如何解决这个问题?提前谢谢。
答案 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