没有路线匹配{:action =>" partner_update",:controller =>"用户"}

时间:2017-02-20 04:53:48

标签: ruby-on-rails devise

我是rails的新手,所以我尝试这样做来添加一个角色,使表单更新,如果用户更新,则可以添加角色。 注意:我正在使用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>

2 个答案:

答案 0 :(得分:1)

在表单操作中,您已将操作称为partner_update,但您没有采取该操作。将其更改为update_partner

您正在将collection路线用于另一条路线,即get 'users/becomepartner'。所以这将生成带有url的收集路径,如:

users/becomepartner/update_partner

您可以通过运行rake routes确认这一点。

但您的表单操作网址会有所不同。

您可以做的是在用户资源路径中创建此收集路由,如:

resources :users do
  collection do
   patch 'update_partner'
  end
end

然后在form_for url选项中,使用update_partner_users_path

如果您不想要用户资源路线,那么只需定义一条路线,如:

get 'users/becomepartner' => 'users#becomepartner'
patch 'user/update_partner' => 'users#update_partner'

我没有运行任何此代码,因此如果有任何语法错误,请将其发布到评论中。

答案 1 :(得分:0)

  1. routes.rb中,进行更改 patch 'update_partner'update 'update_partner'并删除集合,因为您没有对集合进行操作。您已将其添加到do block中,而是添加一条线路路径。

  2. 中的
  3. url必须为update_partner而非partner_update