Сначала я очень новичок в рельсах. так что несут с собой какие-либо ошибки моего нуба. Все еще пытаюсь найти лучшие источники для надежной информации. Многие вещи немного устарели.рельсы аутентификация пароля
Я следил за Rails tutorial и работал с аутентификацией пароля. В моем приложении у меня есть пользователи и отделы с has_many через отношения между ними. Отношения называются manager_relationship. Мое удостоверение подлинности и авторизация для пользователей работают. Кнопка управления и неуправляемости работает для создания отношений с менеджером. Я также создал каждый отдел с безопасным паролем. Я надеялся потребовать от пользователя ввода пароля для отдела, прежде чем отношения менеджера могут быть созданы. Я добавил поле пароля рядом с кнопкой управления.
Модели:
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
Просмотров отдел/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
############################################################
Один быстрый вопрос: вы загружаете текущего пользователя с использованием переменной сеанса? – Amar
на самом деле есть фильтр перед контроллером, который требует, чтобы пользователь выполнил вход, прежде чем они смогут создать или уничтожить отношения менеджера. – doubleA
так что current_user присутствует? поэтому каждая строка manager_relationships имеет поле пароля? вы хотите добавить пароль в таблицу manager_relationships, что вы хотите? – Amar