我是ruby on rails的新手,我在尝试更新对象时不断收到此错误。 这是我的控制器:
class SetorController < ApplicationController
def index
@setor = Setor.all
end
def new
end
def show
@setor = Setor.find(params[:id])
end
def create
@setor = Setor.new(setor_params)
@setor.save
redirect_to @setor
end
def edit
@setor = Setor.find(params[:id])
end
def update
@setor = Setor.find(params[:id])
if (@setor.update(setor_params))
redirect_to @post
else
render 'edit'
end
end
private def setor_params
params.require(:setor).permit(:nome, :sigla, :cnpj)
end
end
这是索引页面 - 我链接以编辑对象:
<%= @setor.each do |s| %>
<%= s.nome %> |
<%= s.sigla %> |
<%= s.cnpj %> |
<%= link_to "edit", edit_setor_path(s.id) %> <br>
<% end %>
这是更新表格:
<h1> Editar Setor </h1>
<%= form_for :setor, url: setor_path(:update) do |f| %>
<p>
<%= f.label :nome %>
<%= f.text_field :nome %> <br>
<%= f.label :sigla %>
<%= f.text_field :sigla %> <br>
<%= f.label :cnpj %>
<%= f.text_field :cnpj %> <br>
</p>
<%= f.submit %>
<% end %>
我错过了什么?
谢谢!
答案 0 :(得分:1)
首先,确保您的路线与edit_setor_path
匹配。您可以在终端中运行rails routes
或转到浏览器中的网址localhost:3000/rails/info/routes
来执行此操作。
在索引页面上,您有以下内容:
<%= link_to "edit", edit_setor_path(s.id) %> <br>
您不需要传入s对象的id。 Rails将自己解决这个问题。相反,只需传入对象:
<%= link_to "edit", edit_setor_path(s) %> <br>
将SetorController的索引操作中的@setor
更改为@setors
,并将index.html.erb文件中的@setor
更改为@setors
。
将edit.html.erb中的:sector更改为@setor。您也可以从edit.html.erb表单中删除url: setor_path(:update)
。
这些更改遵循Rails约定。您应该尽可能多地遵循Rails约定,尤其是在学习Rails时。
答案 1 :(得分:0)
尝试在表单代码中提及@setor
对象:
<%= form_for @setor do |f| %>
答案 2 :(得分:0)
尝试这样的事情怎么样:
将控制器重命名为setors_controller.rb
并将类名更改为SetorsController
- 这是遵循典型的Rails命名约定。
然后确保你有路线:
# config/routes.rb
Rails.application.routes.draw do
resources :setors
end
更新视图的form_for
标记,以使用在控制器中设置的实例变量:
# app/views/setors/edit.html.erb
# NOTE: folder path above... "setor" is now "setors" to follow the Rails convention
<%= form_for @setor do |f| %>
<p>
<%= f.label :nome %>
<%= f.text_field :nome %> <br>
<%= f.label :sigla %>
<%= f.text_field :sigla %> <br>
<%= f.label :cnpj %>
<%= f.text_field :cnpj %> <br>
</p>
<%= f.submit %>
<% end %>