0

工夫に関する私の問題。current_password なしでユーザーの個人データを保存したい。そして、必要なルートだけを残して、いくつかのルートを削除したいと思います。

ルート.rb

  devise_for :users, :controllers => { :registrations => "registrations" }, :skip => [:registrations]
    as :user do
      post "/users" => "devise/registrations#create", :as => :user_registration
      get "/users" => "devise/registrations#new", :as => :new_user_registration
      get "/users/edit" => "devise/registrations#edit", :as => :edit_user_registration
      put "/users" => "devise/registrations#update"
    end

railscasts を見て、自分のアプリケーションに登録コントローラーを追加しました

registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController
  def update
    @user = User.find(current_user.id)
   # email_changed = @user.email != params[:user][:email]
    password_changed = !params[:user][:password].empty?

    successfully_updated = if password_changed
      @user.update_with_password(params[:user])
    else
      @user.update_without_password(params[:user])
    end

    if successfully_updated
      # Sign in the user bypassing validation in case his password changed
      sign_in @user, :bypass => true
      redirect_to root_path
    else
      render "edit"
    end
  end
end

私の見解 edit.html.erb

<h2><%= t('users.edit_registration_data') %></h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

  <ul class="nav nav-tabs">
      <li class="active" ><a href="#profile" data-toggle="tab"><%= t('tabs.private_info') %></a></li>
      <li><a href="#password" data-toggle="tab"><%= t('tabs.change_password') %></a></li>
  </ul>
  <div class="tab-content">
      <div class="tab-pane active" id="profile">
        <div><%= f.label :name, t('form.name') %><br />
        <%= f.text_field :name %></div>
        <div><%= f.label :phone_number, t('form.phone_number') %> <%= t('form.phone_notice' )%><br />
        <%= f.text_field :phone_number, :maxlength => 10 %></div>
        <div><%= f.label :area_id, t('form.area') %><br />
        <%= f.text_field :area_id %></div>
        <div><%= f.label :city_id, t('form.city') %><br />
        <%= f.text_field :city_id %></div>
        <div><%= f.label :email %><br />
        <%= f.email_field :email %></div>
      </div>
      <div class="tab-pane" id="password">
        <div><%= f.label :password, t('users.form.new_password') %> <i>(<%= t('users.notifications.leave_password') %>)</i><br />
        <%= f.password_field :password, :autocomplete => "off" %></div>

        <div><%= f.label :password_confirmation, t('users.form.new_password_confirmation') %><br />
        <%= f.password_field :password_confirmation %></div>

        <div><%= f.label :current_password, t('users.form.current_password') %> <i>(<%= t('users.notifications.need_current_password') %>)</i><br />
        <%= f.password_field :current_password %></div>
      </div>
  </div>

 <br><br><br>  

  <div><%= f.submit t('users.update') %></div>
<% end %>

<%= link_to t('users.back'), :back %>

しかし、パスワード以外のデータを更新すると、アプリケーションは引き続き現在のパスワードを要求します。

コントローラー: デバイス/登録アクション: 更新 1 エラーにより、このユーザーの保存が禁止されました: 現在のパスワードを空にすることはできません

4

1 に答える 1

0
  devise_for :users, :skip => [:registrations]
    as :user do
      post "/users" => "devise/registrations#create", :as => :user_registration
      get "/users" => "devise/registrations#new", :as => :new_user_registration
      get "/users/edit" => "devise/registrations#edit", :as => :edit_user_registration
      put "/users" => "registrations#update"
    end
于 2012-11-18T16:30:26.030 に答える