【问题标题】:how to fix "No route matches [PATCH]"如何修复“没有路线匹配 [PATCH]”
【发布时间】:2015-01-29 03:36:05
【问题描述】:

我是 ruby​​ on rails 的新手。我正在做一个项目,但遇到了一个表单问题。我正在使用设计进行身份验证。我有一个具有管理员和用户角色的用户类。设计为用户生成的添加/更新方法工作正常。当我尝试为管理员创建编辑页面时,我遇到了“没有路由匹配 [PATCH]”错误。这是我正在使用的表格

<h4>Update Profile</h4>
 <%= form_for @user, :url => {:controller => "admin", :action => "update" }  do |f|  %>

<%= hidden_field_tag(:id, @user.id) %>
<table>
  <tr>
    <td>First Name</td>
    <td><%= f.text_field  :first_name , :class => "form-control"%></td>
  </tr>
  <tr>
    <td>Last Name</td>
    <td><%= f.text_field  :last_name , :class => "form-control"%></td>
  </tr>
  <tr>
    <td>Email</td>
    <td><%= f.text_field  :email , :class => "form-control"%></td>
  </tr>
  <tr>
    <td></td>
    <td><%= f.submit "Update", :class => "btn btn-md btn-success pull-right" %></td>
  </tr>
</table>

这是我的控制器方法

def edit
end

def update
  @user = User.find(params[:id])
  if request.post?
     if(@user.update_attributes(params[:first_name, :last_name, :email] ))
      redirect_to :action =>  "admin_portal"
  else
    render :action => "edit"
  end
end

end

我也有路线

get 'admin/update'
 get 'admin/edit'

谁能建议我如何解决这个问题。

【问题讨论】:

    标签: ruby-on-rails ruby devise


    【解决方案1】:

    重点是:您仅从 HTTP 的方法中设置 GET,而对于更新,您需要 PUTPATCH 方法。 使用PUTPATCH 时有一些约定,但在您的情况下,如您所说,制作PATCH 路由将解决您的问题

    patch 'admin/:1'
    

    但是,显然您正在为每个 REST 方法编写自己的路由,并且 Rails 有一个名为 resources 的“帮助器”结构,它为您创建所有 REST 方法。 您可以在config/routes.rb 上只创建一个入口,例如:

    resources :admins
    

    它会生成每个指向您的user_controller 并重命名为admin 的REST 方法的路由。只放那行代码,就相当于在你的配置/路由上写了所有这些命令:

    get 'admins', controller: 'admins', action: :index
    get 'admin/:id', controller: 'admins', action: :show
    get 'admin/new', controller: 'admins', action: :new
    get 'admin/:id/edit', controller: 'admins', action: :edit
    post 'admin', controller: 'admins', action: :create
    patch 'admin/:id', controller: 'admins', action: :update
    put 'admin/:id', controller: 'admins', action: :update
    delete 'admin/:id', controller: 'admins', action: :delete
    

    您可以在Rails guides 上查看更多信息。它对创建路线有很多有用的建议。

    【讨论】:

      【解决方案2】:

      这是因为您有 form_for @user 用于持久模型,它会生成 patch,而您在路由中只有 get。将get 更改为patch。更多信息http://guides.rubyonrails.org/routing.html

      【讨论】:

      • 感谢伊戈尔的建议。我只是尝试使用补丁而不是获取,现在我得到了一个不同的错误。它说在 AdminController 中找不到更新操作
      • 是的,刚刚意识到,你需要patch 'admin/:id', to: 'admin#update'
      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 2015-11-21
      • 2015-12-31
      • 2015-11-08
      相关资源
      最近更新 更多