2

まず、私はRailsに非常に慣れていません。だから私の初心者の間違いに耐えなさい。信頼できる情報のための最良の情報源をまだ見つけようとしています。多くのものは少し時代遅れです。

Railsのチュートリアルに従い、パスワード認証を使用していました。私のアプリには、ユーザーと、それらの間の関係を通じてhas_manyを持つ部門があります。この関係はmanager_relationshipと呼ばれます。ユーザーのMY認証と承認は機能します。管理および管理解除ボタンは、マネージャー関係を作成するために機能します。また、各部門に安全なパスワードを設定しました。マネージャーとの関係を構築する前に、ユーザーに部門のパスワードの入力を要求したいと思っていました。管理ボタンの横にパスワードフィールドを追加しました。

モデル:

department.rb
class Department < ActiveRecord::Base
attr_accessible :department_name, :password, :password_confirmation
has_many :manager_relationships, dependent: :destroy
has_many :users, through: :manager_relationships
has_secure_password

manager_relationship.rb

class ManagerRelationship < ActiveRecord::Base
attr_accessible :department_id

belongs_to :user
belongs_to :department

validates :user_id, presence: true
validates :department_id, presence: true
end

user.rb

class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation
has_many :manager_relationships, dependent: :destroy
has_many :departments, through: :manager_relationships
has_secure_password

ビューdepartment/show.html.erb

...
<div class="span8">
    <%= render 'manage_form' if signed_in? %>
</div>
</div>

departmnet / _manage.html.erb

<%= form_for(current_user.manager_relationships.build(department_id: @department.id), remote: true) do |f| %>
<div><%= f.hidden_field :bdepartment_id %></div>
<%= f.submit "Manage Department", class: "btn btn-large btn-primary" %>
<% end %>

コントローラー:ManagerRelationshipsController

class ManagerRelationshipsController < ApplicationController
before_filter :signed_in_user

def create
    @department = Department.find(params[:manager_relationship][:department_id])

    current_user.manage!(@department)
    respond_to do |format|
        format.html { redirect_to @department }
        format.js
    end
end

上記のコードは機能します。これは、マネージャー関係を正常に作成および破棄します。ただし、認証はありません。すべてのユーザーが任意の部門を管理できます。manager_relationshipを作成するために、管理ユーザーに部門パスワードの入力を要求したい

これが私が試したことです。

departmnet / _manage.html.erb

 <%= form_for(current_user.manager_relationships.build(department_id: @department.id), 
remote: true) do |f| %>
##################This Was Added ##############
<div>
<%= f.label :password %>
<%= f.password_field :password %>
</div>
################################################

<div><%= f.hidden_field :department_id %></div>
<%= f.submit "Manage Department", class: "btn btn-large btn-primary" %>
<% end %>

ManagerRelationshipsController

class ManagerRelationshipsController < ApplicationController
before_filter :signed_in_user
def create
    @department = Department.find(params[:manager_relationship][:department_id])
            ########################The line below was Added ##########################
    if @department.authenticate(params[:manager_relationship][:password])
            ###########################################################################
        current_user.manage!(@department)
    respond_to do |format|
        format.html { redirect_to @department }
        format.js
    end
       ####################I added this##################
    else
        flash.now[:error] = 'Invalid password'
        render 'new'
    end
       ############################################################
4

2 に答える 2

0

追加したコードは正しかった。問題は、無効なパスワードの後に​​表示しようとしたフラッシュメッセージにありました。

if authenticate
else
flash.now[:error] = 'Invalid password'
render 'new'  <<I removed this line.>>
end

私のコードはmanager_relationships/newをレンダリングしようとしていましたが、そこにはありませんでした。これを削除した後、ボタンは計画どおりに機能しました。ただし、フラッシュメッセージは表示されません。それは別のトピックなので、別の質問に投稿しました。

于 2013-03-24T02:06:26.873 に答える
0

理想的には、ユーザーはログインしているので、ユーザーがページにアクセスする方法についてパスワードは必要ありません。使用できるデータを設定/設定解除するための別のレベルの保護が必要な場合があります

 @user = User.where(:email=>...).first 
 # Authenticating User sonce your email id is in session
 # You don't need to store password on manager_relationship
 # create attr_accessor 
 @user.authenticate(params[:manager_relationship][:password])
 # if user is authenticate then you can add/edit your data
于 2013-03-23T18:50:14.703 に答える