2

ユーザーがプロジェクトをデータベースに入力して、後で検索できるようにするアプリがあります。各ユーザーには独自のログインがあり、システム管理者によって提供されます。ユーザーが初めてログインするときに、通常のホームページに「パスワードの変更」ビューを表示して、ユーザーがアプリを使用する前にパスワードを変更する必要があるようにします。

pass_changeUserテーブルにブール列を設定しました。これはfalse、新しいユーザーが作成されるときです。

現時点では、ユーザーが初めてログインすると、パスワード変更ビューが表示されますが、この機能をテストすると、パスワードは変更されず、新しいパスワードを送信した後もビューは変わりません。そのユーザーのpass_changeforはに変更されませんtrue

インデックスビュー:

<html>
<% if current_user.pass_changed == true %>

  <%= stylesheet_link_tag    "index"%>
<body>

<div id = "section1">
<div class = "h1">Database Search</div>

    <div class = "h3">What would you like to do?</div>



<div class="new_project_button">
<%= button_to "Create New Project", new_project_path, :class => "button", :method => "get" %>
</div>
<div class="search_button">
<%= button_to "      Search      ", search_path, :class => "button", :method => "get" %>
</div>
</div>


</body>

<%else%>


<div class ="title">Change your password</div><%= current_user.pass_changed %>


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

<div class = "signin">


<div class = "field">New Password: 
  <%= f.password_field :password, :class => "password" %>
  </div>

  <div class = "field">Confirm: 
  <%= f.password_field :password_confirmation, :class => "password" %>
  </div>

                        <%= f.hidden_field :pass_changed, :value => true %>
  <div class = "signup_button"><%= f.submit "Change my password", :class => "button" %>
  </div>

</div>
<% end %>
<% end %>


</html> 

アプリケーションヘルパー:

module ApplicationHelper

    def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end
end

誰かが私が間違っているかもしれないことを見ることができますか?認証を処理するためにデバイスgemを使用しています。どんな助けでも大歓迎です。前もって感謝します。

アップデート:

パスワードを変更しようとしたときのログは次のとおりです。

Started PUT "/users/password" for 127.0.0.1 at 2012-10-29 14:15:05 +0000
Processing by Devise::PasswordsController#update as HTML
  Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>"eBU5jvN6C+JSIZNmsEaxUyydrvPRjtGZeWLxlQzFJKI=", "user"=>{"password"=
>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "pass_changed"=>"true"}, "commit"=>"Change my password"}
  ←[1m←[35mUser Load (0.0ms)←[0m  SELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1
Redirected to http://localhost:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 0ms (ActiveRecord: 0.0ms)


Started GET "/" for 127.0.0.1 at 2012-10-29 14:15:05 +0000
Processing by ProjectsController#index as HTML
  ←[1m←[36mUser Load (0.0ms)←[0m  ←[1mSELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1←[0m
  ←[1m←[35mProject Load (0.0ms)←[0m  SELECT "projects".* FROM "projects"
  Rendered projects/index.html.erb within layouts/application (0.0ms)
Completed 200 OK in 16ms (Views: 15.6ms | ActiveRecord: 0.0ms)

インデックスビューは次のようになります。

<html>
<% if current_user.pass_changed == true %>

  <%= stylesheet_link_tag    "index"%>
<body>

<div id = "section1">
<div class = "h1">Database Search</div><%= current_user.pass_changed %>

    <div class = "h3">What would you like to do?</div>



<div class="new_project_button">
<%= button_to "Create New Project", new_project_path, :class => "button", :method => "get" %>
</div>
<div class="search_button">
<%= button_to "      Search      ", search_path, :class => "button", :method => "get" %>
</div>
</div>


</body>

<%else%>

<%= form_for(current_user, :as => :user, :url => password_path(current_user), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

<div class = "signin">


<div class = "field">New Password: 
  <%= f.password_field :password, :class => "password" %>
  </div>

  <div class = "field">Confirm: 
  <%= f.password_field :password_confirmation, :class => "password" %>
  </div>

                        <%= f.hidden_field :pass_changed, :value => true %>
  <div class = "signup_button"><%= f.submit "Change my password", :class => "button" %>
  </div>

</div>
<% end %>
<% end %>


</html> 

そして、私が追加したユーザーモデルには次のものがあります。

after_update :update_pass_changed

def update_pass_changed
  self.pass_changed = true
  self.save
end
4

1 に答える 1

1

これを試してみてください。あなたにとって役立つかもしれません。あなたのモデルを書き込んでください

after_create :update_pass_change

def update_pass_change
  self.pass_change = true
  self.save
end

また

def update_pass_change
  self.update_attributes(:pass_change => true)
end
于 2012-10-29T12:21:43.640 に答える