【问题标题】:No route matches [PATCH] "/editer"没有路线匹配 [PATCH] "/editor"
【发布时间】:2016-01-09 17:53:27
【问题描述】:

我的错误是:没有路由匹配 [PATCH] "/editer"

路线:

get "/editer", :to => 'users#edit'
post "/editer", :to => 'users#update'

控制器:

def edit
        @user = User.find(params[:id])
end

def update
        @user = User.find(params[:id])
        if @user.update_attributes(user_params)
            redirect_to :action=>"show", :id=>@user.id
            flash[:success] = "ok"
        else
          render 'edit'
        end
end

查看:

<%=s imple_form_for @user ,:html=>{class: "form-horizontal", id: "form" } ,:url => editer_url do |f| %>
    <div class="form-group">
        <label class="col-sm-2 control-label">Email (*)</label>
        <div class="col-sm-10">
            <%=f .input :email, :label=>false, :id=>"email", :placeholder => 'Email', :class=>"form-control required email", :name=>"email", :type=>"text" %></div>
    </div>
    <div class="hr-line-dashed"></div>
    <div class="form-group">
        <div class="col-sm-4 col-sm-offset-2">
            <button class="btn btn-primary" type="submit">Guardar</button>
            <button class="btn btn-white" type="submit">Cancelar</button>
        </div>
    </div>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-4.2


    【解决方案1】:

    没有路线匹配 [PATCH] "/editer"

    你需要改变

    post "/editer", :to => 'users#update'
    

    patch "/editer", :to => 'users#update'
    

    【讨论】:

    • 现在出现以下错误:Could not find User with 'id' =
    • @SmithZahir 你能发布生成的参数吗?
    • **Insert **&lt;% = hidden_field_tag: id, @ user.id%&gt; 因为我没有在更新中获得 id,现在我得到一个未更新的回滚:Parameters: {"utf8" =&gt; "✓""authenticity_token"=&gt;"Up+onyR3BLbOZO6dfb+hSIS9sFqgUrTDeldJGUfmOwGgdAmPEq9bvxwv/YI8nKy+7oQdQxtbP0lgSxHqeMmuiQ==", "user" =&gt; {"email" =&gt; "correo1@example.com"}, "id" =&gt; "1"}    User Load (0.2ms) SELECT users. * FROMusers` WHERE users.@987654328 @ = 1 LIMIT 1 (0.1ms) BEGIN User Exists (0.1ms) SELECT 1 FROM users AS one WHERE (` users.email` = 'correo1@example.com' AND users.id! = 1) LIMIT 1 (0.1ms) ROLLBACK`
    • @SmithZahir 你是用户表中 id = 1 的用户记录吗?
    • 如果我有一个 id = 1 的用户注册
    【解决方案2】:

    RESTful API 协议规定PATCH 动词更适合更新POST 动词更适合创建

    Rails 遵循此约定,因此会出现错误,因为您已使用 post 动词声明了路线。只需从 post "/editer", :to =&gt; 'users#update' 更改该行 到

    patch "/editer", :to => 'users#update'
    

    您不妨考虑制作user 资源,这将使事情更具语义。

    【讨论】:

      【解决方案3】:

      不管HTTP verbs 的错误使用(你的路由应该定义为patch ...),你都会收到一个错误,因为你不符合Rails 的resourceful 路由结构:

      #config/routes.rb
      resources :users, path: "editer", only: [:edit, :update], path_names: { edit: "", update: "" } #-> url.com/editer/:id
      
      <%= simple_form_for @user ,:html=> {class: "form-horizontal", id: "form" } do |f| %>
      

      这无关紧要(你可以在 Rails 中做任何你想做的事);不同之处在于您在控制器中使用标准化的resourceful 操作设置(需要params[:id])。

      以上内容应该可以为您解决问题。

      【讨论】:

      • 在我没有使用编辑器的表单上:resources :users, path: "editer", only: [:edit, :update], path_names: { edit: "", update: "" } #-&gt; url.com/editer/:id,我在路由文件中的设置应该是这样吗?即使我无法编辑记录。
      • 您的路线是 get "/editer" =&gt; "users#edit" 等,我的路线已修复
      • 在我没有使用编辑器的表单上:resources :users, path: "editer", only: [:edit, :update], path_names: { edit: "", update: "" } #-&gt; url.com/editer/:id,我在路由文件中的设置应该是这样吗?即使我无法编辑记录我的错误是No route matches [PATCH] "/users/1"
      • 您的表单明确指出url: editer_url,所以是的,您在表单中使用editer
      • 在我的控制台中,我知道它已经存在并且不会更新回滚:User Exists (0.1ms) SELECT 1 FROM users` 作为一个 WHERE (`users.email` = 'correo1@example.com' AND @987654335 @.id! = 1) LIMIT 1 (0.2ms) ROLLBACK`
      猜你喜欢
      • 2016-02-04
      • 2018-07-11
      • 1970-01-01
      • 2015-01-29
      • 2021-02-27
      • 1970-01-01
      • 2015-11-21
      • 2015-12-31
      • 2015-11-08
      相关资源
      最近更新 更多