编辑用户详细信息可创建新用户 设计,Rails 4

我有奇怪的问题,以前创建的表单而不是更新用户详细信息,如电子邮件或名称创建具有给定详细信息的新用户。

我的表单:我从views / devise / registrations / edit中获取的代码示例

 true, :id=>"user-edit"},remote: true, format: :json) do |f| %> 
"user-input form-control", :id=>"user-name" ,:placeholder=> "Lietotājvārds*",:"data-parsley-group"=>"f1" %>
"user-input form-control", :id=>"password",:placeholder=> "E-pasts *",:"data-parsley-group"=>"f2" %>
"off" ,:class=>"user-input form-control", :id=>"password",:placeholder=> "Vecā parole* ",:"data-parsley-group"=>"f3" %>
"user-input form-control", :id=>"password",:placeholder=> "Jaunā parole* vismaz 8 simboli ", :"data-parsley-group"=>"f3" %>
"user-input form-control", :id=>"password",:placeholder=> "Atkārtot paroli * vismaz 8 simboli ", :"data-parsley-group"=>"f3" %>

路线文件:

  devise_for :users, :controllers => {:registrations=> "registrations"} 

注册控制器:

 class RegistrationsController < Devise::RegistrationsController clear_respond_to respond_to :json def sign_up_params params.require(:user).permit( :email, :password, :password_confirmation,:name, :not_a_robot,:current_password,:bypass_humanizer) end def account_update_params params.require(:user).permit(:name, :email, :password, :password_confirmation, :current_password, :not_a_robot, :bypass_humanizer) end private :sign_up_params private :account_update_params protected def update_resource(resource, params) resource.update_without_password(params) end end 

在申请助手:

 module ApplicationHelper def resource_name :user end def resource @resource ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end end 

日志文件:

  Started POST "/ru/users" for 85.255.65.15 at 2015-09-28 19:32:25 +0300 Processing by RegistrationsController#create as JS Parameters: {"utf8"=>"✓", "user"=>{"name"=>"ooppapa", "email"=>"test11@!!!", "current_password"=>"[FILTERED]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "bypass_humanizer"=>"true", "not_a_robot"=>"1"}, "locale"=>"ru"} [1m[36mBanlist Load (2.0ms)[0m [1mSELECT `banlists`.* FROM `banlists` WHERE (ip_adress = '85.255.65.15')[0m [1m[35mCountry Load (1.5ms)[0m SELECT `countries`.* FROM `countries` WHERE `countries`.`id` = 1 LIMIT 1 [1m[36mRegion Load (1.3ms)[0m [1mSELECT `regions`.* FROM `regions` WHERE `regions`.`country_id` = 1[0m [1m[35m (0.4ms)[0m BEGIN [1m[36mUser Exists (44.1ms)[0m [1mSELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'test11@!!!' LIMIT 1[0m [1m[35mUser Load (24.3ms)[0m SELECT `users`.* FROM `users` WHERE `users`.`confirmation_token` = '5c5e282bd4c139c7764506b785d54119ceee5499426b555c3650cfc7190ee947' ORDER BY `users`.`id` ASC LIMIT 1 [1m[36mSQL (2.1ms)[0m [1mINSERT INTO `users` (`confirmation_sent_at`, `confirmation_token`, `created_at`, `email`, `encrypted_password`, `name`, `updated_at`) VALUES ('2015-09-28 19:32:29', '5c5e282bd4c139c7764506b785d54119ceee5499426b555c3650cfc7190ee947', '2015-09-28 19:32:28', 'test11@individualki.eu', '$2a$10$mEHajmY0H1NueGrrap7NNu0LuViDEJ.imAS4jhdj1KIyPRIyej/NC', 'ooppapa', '2015-09-28 19:32:28')[0m Rendered devise/mailer/confirmation_instructions.html.erb (29.2ms) Devise::Mailer#confirmation_instructions: processed outbound mail in 1726.8ms Sent mail to test11@!!!.eu (776.1ms) Date: Mon, 28 Sep 2015 19:32:31 +0300 From: support@!!!!.eu Reply-To: support@!!!!.eu To: test11@!!!!.eu Message-ID:  Subject: Confirmation instructions Mime-Version: 1.0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit 

Welcome !!!

You can confirm your account email through the link below:

我的路线:

 rake routes new_user_session GET (/:locale)/users/sign_in(.:format) devise/sessions#new {:locale=>/lv|ee|ru/} user_session POST (/:locale)/users/sign_in(.:format) devise/sessions#create {:locale=>/lv|ee|ru/} destroy_user_session DELETE (/:locale)/users/sign_out(.:format) devise/sessions#destroy {:locale=>/lv|ee|ru/} user_password POST (/:locale)/users/password(.:format) devise/passwords#create {:locale=>/lv|ee|ru/} new_user_password GET (/:locale)/users/password/new(.:format) devise/passwords#new {:locale=>/lv|ee|ru/} edit_user_password GET (/:locale)/users/password/edit(.:format) devise/passwords#edit {:locale=>/lv|ee|ru/} PATCH (/:locale)/users/password(.:format) devise/passwords#update {:locale=>/lv|ee|ru/} PUT (/:locale)/users/password(.:format) devise/passwords#update {:locale=>/lv|ee|ru/} cancel_user_registration GET (/:locale)/users/cancel(.:format) registrations#cancel {:locale=>/lv|ee|ru/} user_registration POST (/:locale)/users(.:format) registrations#create {:locale=>/lv|ee|ru/} new_user_registration GET (/:locale)/users/sign_up(.:format) registrations#new {:locale=>/lv|ee|ru/} edit_user_registration GET (/:locale)/users/edit(.:format) registrations#edit {:locale=>/lv|ee|ru/} PATCH (/:locale)/users(.:format) registrations#update {:locale=>/lv|ee|ru/} PUT (/:locale)/users(.:format) registrations#update {:locale=>/lv|ee|ru/} DELETE (/:locale)/users(.:format) registrations#destroy {:locale=>/lv|ee|ru/} user_confirmation POST (/:locale)/users/confirmation(.:format) devise/confirmations#create {:locale=>/lv|ee|ru/} new_user_confirmation GET (/:locale)/users/confirmation/new(.:format) devise/confirmations#new {:locale=>/lv|ee|ru/} GET (/:locale)/users/confirmation(.:format) devise/confirmations#show {:locale=>/lv|ee|ru/} update_password_user PATCH (/:locale)/user/update_password(.:format) users#update_password {:locale=>/lv|ee|ru/} edit_user GET (/:locale)/user/edit(.:format) users#edit {:locale=>/lv|ee|ru/} sms_receive GET (/:locale)/sms/receive(.:format) sms#receive {:locale=>/lv|ee|ru/} root GET /(:locale)(.:format) girls#index {:locale=>/lv|ee|ru/} 

我很迷惑。 是register_path(resource_name)是否会产生此错误?

任何建议都可能有所帮助。 提前致谢。

问题出在表单中,因为它指向registration_path(resource_name)路径。

您使用的示例来自如何:允许用户编辑其帐户而不提供密码 ,它说:

并提供编辑和更新操作,就像对应用程序中的任何其他资源一样。

这意味着您需要创建一个指向编辑方法的路径并根据需要使用它。

上面的示例用于更新没有密码的用户,但您正在做的是更新密码。

有关解决方案,请阅读如何:允许用户编辑其密码

一个示例解决方案 – #3:

UsersController

 class UsersController < ApplicationController before_filter :authenticate_user! def edit @user = current_user end def update_password @user = User.find(current_user.id) if @user.update(user_params) # Sign in the user by passing validation in case their password changed sign_in @user, :bypass => true redirect_to root_path else render "edit" end end private def user_params # NOTE: Using `strong_parameters` gem params.require(:user).permit(:password, :password_confirmation) end end 

如果您使用多个范围,请指定要登录的范围:

 sign_in :user, @user, bypass: true 

路线应如下:

 resource :user, only: [:edit] do collection do patch 'update_password' end end 

视图

 <%= form_for(@user, :url => { :action => "update_password" } ) do |f| %> 
<%= f.label :password, "Password" %>
<%= f.password_field :password, :autocomplete => "off" %>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation %>
<%= f.submit %>
<% end %>

要使用“confirm_password”字段强制用户在使用新密码更新之前输入旧密码:将@user.update(user_params)更改为控制器中的@user.update_with_password(user_params) ,同时将:current_password添加到允许的参数中,然后并将以下内容添加到视图代码中:

 
<%= f.label :current_password %> (we need your current password to confirm your changes)
<%= f.password_field :current_password %>

请记住,Devise模型就像您应用程序中的任何模型一样。 如果要提供自定义行为,只需实现新操作和新控制器。 不要试图弯曲Devise。

我看到了你的问题,也许问题出在表格调用上。

尝试插入html: { method: :put } 。 使用simple_form我使用这种方式:

 = simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| 

你推测,你如何省略发送表单的方法,它作为post发送并创建新记录。