我是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>
答案 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)
在routes.rb
中,进行更改
patch 'update_partner'
到update 'update_partner'
并删除集合,因为您没有对集合进行操作。您已将其添加到do block
中,而是添加一条线路路径。
,url
必须为update_partner
而非partner_update
。