Ruby on rails 编辑用户详细信息将创建新用户。设计,轨道4

Ruby on rails 编辑用户详细信息将创建新用户。设计,轨道4,ruby-on-rails,devise,Ruby On Rails,Devise,我有一个奇怪的问题,以前创建的表单没有更新用户的详细信息,例如电子邮件或姓名,而是创建了具有给定详细信息的新用户 我的表格: 我从视图/设计/注册/编辑中获取的代码示例 <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { "data-parsley-validate" => true, :id=>"user-edit"},remote: true, fo

我有一个奇怪的问题,以前创建的表单没有更新用户的详细信息,例如电子邮件或姓名,而是创建了具有给定详细信息的新用户

我的表格: 我从视图/设计/注册/编辑中获取的代码示例

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { "data-parsley-validate" => true, :id=>"user-edit"},remote: true, format: :json) do |f| %>   

    <div class="form-group">
        <%= f.text_field :name,:class=>"user-input form-control", :id=>"user-name" ,:placeholder=> "Lietotājvārds*",:"data-parsley-group"=>"f1" %>               
    </div>

    <div class="form-group">    
        <%= f.email_field :email ,:class=>"user-input form-control", :id=>"password",:placeholder=> "E-pasts *",:"data-parsley-group"=>"f2" %>                            
    </div>   

    <div class="form-group">                  
        <%= f.password_field :current_password, :autocomplete => "off"  ,:class=>"user-input form-control", :id=>"password",:placeholder=> "Vecā parole*                       ",:"data-parsley-group"=>"f3" %>  
    </div>

    <div class="form-group">                      
        <%= f.password_field :password , :class=>"user-input form-control", :id=>"password",:placeholder=> "Jaunā parole*                       vismaz 8 simboli ",  :"data-parsley-group"=>"f3" %>  
    </div>

    <div class="form-group">                        
       <%= f.password_field :password_confirmation , :class=>"user-input form-control", :id=>"password",:placeholder=> "Atkārtot paroli *                     vismaz 8 simboli ",  :"data-parsley-group"=>"f3" %>      
    </div>

    <button type="submit" class="blue-button btn btn-default">Apstiprināt</button>
<%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: <56096b9f98eb5_25e4640a718550c6@!!!!!>
    Subject: Confirmation instructions
    Mime-Version: 1.0
    Content-Type: text/html;
     charset=UTF-8
    Content-Transfer-Encoding: 7bit

    <p>Welcome !!!</p>

    <p>You can confirm your account email through the link below:</p>
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
注册控制器:

 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
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/}
日志文件:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { "data-parsley-validate" => true, :id=>"user-edit"},remote: true, format: :json) do |f| %>   

    <div class="form-group">
        <%= f.text_field :name,:class=>"user-input form-control", :id=>"user-name" ,:placeholder=> "Lietotājvārds*",:"data-parsley-group"=>"f1" %>               
    </div>

    <div class="form-group">    
        <%= f.email_field :email ,:class=>"user-input form-control", :id=>"password",:placeholder=> "E-pasts *",:"data-parsley-group"=>"f2" %>                            
    </div>   

    <div class="form-group">                  
        <%= f.password_field :current_password, :autocomplete => "off"  ,:class=>"user-input form-control", :id=>"password",:placeholder=> "Vecā parole*                       ",:"data-parsley-group"=>"f3" %>  
    </div>

    <div class="form-group">                      
        <%= f.password_field :password , :class=>"user-input form-control", :id=>"password",:placeholder=> "Jaunā parole*                       vismaz 8 simboli ",  :"data-parsley-group"=>"f3" %>  
    </div>

    <div class="form-group">                        
       <%= f.password_field :password_confirmation , :class=>"user-input form-control", :id=>"password",:placeholder=> "Atkārtot paroli *                     vismaz 8 simboli ",  :"data-parsley-group"=>"f3" %>      
    </div>

    <button type="submit" class="blue-button btn btn-default">Apstiprināt</button>
<%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: <56096b9f98eb5_25e4640a718550c6@!!!!!>
    Subject: Confirmation instructions
    Mime-Version: 1.0
    Content-Type: text/html;
     charset=UTF-8
    Content-Transfer-Encoding: 7bit

    <p>Welcome !!!</p>

    <p>You can confirm your account email through the link below:</p>
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
我很困惑。是否是注册路径(资源名称)导致了此错误

任何建议都会有帮助的。!
提前感谢。

问题在表单中,因为它指向
注册路径(资源名称)
路径

您正在使用的示例取自以下内容:

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

这意味着您需要创建到编辑方法的路由,并根据需要使用它

上面的示例用于在不使用密码的情况下更新用户,但您所做的是更新密码

有关解决方案,请阅读

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

用户控制器

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { "data-parsley-validate" => true, :id=>"user-edit"},remote: true, format: :json) do |f| %>   

    <div class="form-group">
        <%= f.text_field :name,:class=>"user-input form-control", :id=>"user-name" ,:placeholder=> "Lietotājvārds*",:"data-parsley-group"=>"f1" %>               
    </div>

    <div class="form-group">    
        <%= f.email_field :email ,:class=>"user-input form-control", :id=>"password",:placeholder=> "E-pasts *",:"data-parsley-group"=>"f2" %>                            
    </div>   

    <div class="form-group">                  
        <%= f.password_field :current_password, :autocomplete => "off"  ,:class=>"user-input form-control", :id=>"password",:placeholder=> "Vecā parole*                       ",:"data-parsley-group"=>"f3" %>  
    </div>

    <div class="form-group">                      
        <%= f.password_field :password , :class=>"user-input form-control", :id=>"password",:placeholder=> "Jaunā parole*                       vismaz 8 simboli ",  :"data-parsley-group"=>"f3" %>  
    </div>

    <div class="form-group">                        
       <%= f.password_field :password_confirmation , :class=>"user-input form-control", :id=>"password",:placeholder=> "Atkārtot paroli *                     vismaz 8 simboli ",  :"data-parsley-group"=>"f3" %>      
    </div>

    <button type="submit" class="blue-button btn btn-default">Apstiprināt</button>
<%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: <56096b9f98eb5_25e4640a718550c6@!!!!!>
    Subject: Confirmation instructions
    Mime-Version: 1.0
    Content-Type: text/html;
     charset=UTF-8
    Content-Transfer-Encoding: 7bit

    <p>Welcome !!!</p>

    <p>You can confirm your account email through the link below:</p>
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
路线应如下所示:

查看

<%= form_for(@user, :url => { :action => "update_password" } ) do |f| %>
  <div class="field">
    <%= f.label :password, "Password" %><br />
    <%= f.password_field :password, :autocomplete => "off"  %>
  </div>
  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %>
  </div>
  <div class="action_container">
    <%= f.submit %>
  </div>
<% end %>
请记住,Desive模型与应用程序中的任何模型一样。如果你 要提供自定义行为,只需实现新操作和新功能 控制器。不要试图弯曲这个装置


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

尝试插入
html:{method::put}
。对于简单表单,我使用以下方式:

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

您是如何省略了发送表单的方法的,我想它是以邮寄方式发送并创建一个新记录。

RegistrationController中的内容#创建和路由中的内容file@HithamS.AlQadheeb在注册文件中,我没有create方法,因为它继承自designe?还是我错了?你是对的。我错过了设计部分。@HithamS.AlQadheeb,也许我应该添加create方法?不需要,除非您正在更改“create”函数。检查我的答案,希望它能帮助你找到更好的方法现在我按照建议做了,但是我发现路由错误没有路由匹配[POST]“/user/update_password”你重启服务器了吗?执行“rake routes”并将其添加到问题中,我按照你的建议做了。正如你所看到的,路由有一个补丁路由,错误是抱怨GET路由。创建GET路由或通过确保表单显示