Ruby on Rails - 没有路由匹配[POST]“/ setor / update”

时间:2017-05-14 00:34:01

标签: ruby-on-rails ruby web

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

我错过了什么?

谢谢!

3 个答案:

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