Ruby on rails 没有路由匹配{:action=>;“partner”update,“controller=>;“users”}

Ruby on rails 没有路由匹配{:action=>;“partner”update,“controller=>;“users”},ruby-on-rails,devise,Ruby On Rails,Devise,我是rails新手,所以我尝试添加一个角色,制作一个表单进行更新,如果用户更新成功,则添加角色。 注意:我正在使用Desive and rolify与cancancan 路线 get 'users/becomepartner' => 'users#becomepartner' do collection do patch 'update_partner' end end 这是我的用户控制器 def becomepartner @user = current_us

我是rails新手,所以我尝试添加一个角色,制作一个表单进行更新,如果用户更新成功,则添加角色。 注意:我正在使用Desive and rolify与cancancan

路线

 get 'users/becomepartner' => 'users#becomepartner' do
  collection do
    patch 'update_partner'
  end
end
这是我的用户控制器

def becomepartner
    @user = current_user
  end

  def update_partner
    @user = User.find(current_user.id)
    if @user.update_with_password(partner_params)
        self.add_role(:partner)
      # Sign in the user by passing validation in case their password changed
      bypass_sign_in(@user)
      redirect_to root_path, notice: 'now you can create'
    else
      render :becomepartner
    end
  end

  private

  def partner_params
    # NOTE: Using `strong_parameters` gem
    params.require(:user).permit(:name, :style, :current_password, :email)
  end
这是我的观点becomepartner.html

<div>
<%= form_for(@user, :url => { :action => "update_partner" } ) do |f| %>

 <div class="field">
   <%= f.label :style %>
   <%= f.text_field :style %>
 </div>

     <div class="field">
      <%= f.label :name %>
      <%= f.text_field :name %>
    </div>

    <div class="field">
      <%= f.label :email %>
      <%= f.email_field :email %>
    </div>

    <div class="field">
      <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i>
      <%= f.password_field :current_password, autocomplete: "off" %>
    </div>
<% end %>
</div>

{:action=>“update_partner”})do | f |%>
(我们需要您的当前密码来确认您的更改)

在表单操作中,您将操作称为“合作伙伴更新”,但您没有该操作。将其更改为
update\u partner

您正在为另一个单独的路由使用
集合
路由,即
get'users/becomepartner'
。因此,这将生成url如下的收集路由:

users/becomepartner/update_partner
您可以通过运行
rake routes
来确认这一点

但您的表单操作url将不同

您可以在用户资源路由内创建此收集路由,如:

resources :users do
  collection do
   patch 'update_partner'
  end
end
get 'users/becomepartner' => 'users#becomepartner'
patch 'user/update_partner' => 'users#update_partner'
然后在form\u for url选项中,使用
update\u partner\u users\u path

如果不需要用户资源路由,只需定义一个路由,如:

resources :users do
  collection do
   patch 'update_partner'
  end
end
get 'users/becomepartner' => 'users#becomepartner'
patch 'user/update_partner' => 'users#update_partner'
我还没有运行任何这段代码,所以如果有任何语法错误,请在注释中发布它

  • routes.rb
    中,更改
    将“更新合作伙伴”
    修补到
    更新“更新合作伙伴”
    并删除集合,因为您没有对集合进行操作。您已将其添加到
    do块中,而不是添加一条线性路由路径

  • 表单中,
    url
    必须是
    update\u partner
    而不是
    partner\u update


  • 我想它是
    update\u partner
    而不是
    partner\u update
    ,显示你的
    rake routes
    谢谢你,我没有注意到它LOL,但它仍然是同一个错误。你的意思是,它仍然在搜索动作
    partner\u update
    ?不,问题是一样的,但动作的名称我已经像你说的那样改变了,没有与之匹配的路由{:action=>“update_partner”,:controller=>“users”}您是否可以从路由中删除集合,因为它是单个对象…请检查我的更新答案。