2016-02-25 2 views
1

Я следовал за учебником здесь: http://www.sitepoint.com/messaging-rails-mailboxer/, чтобы внедрить драгоценный камень почтового ящика в мое приложение и его работу как следует. Однако после внедрения теперь я должен каким-то образом ограничить разговоры между пользователями таким образом, что:Ограничение почтового ящика Разговоры между конкретными пользователями

  • , если текущий пользователь является студентом (перечисление: 1) он может отправлять сообщения только одному пользователю только который он парного с в таблице пар.
  • Если текущий пользователь является супервизором (перечисление: 2), он может отправлять сообщения только студентам, с которыми он сопряжен, в таблице пар.

Я думаю, что мне нужно внести изменения в модуль messages_helper, но я не знаю, что именно делать.

Модель User.rb

class User < ActiveRecord::Base 

    enum role: [:student, :supervisor, :admin] 
    after_initialize :set_default_role, :if => :new_record? 

    has_many :students, class_name: "User", 
         foreign_key: "supervisor_id" 

    belongs_to :supervisor, class_name: "User" 

    has_and_belongs_to_many :pairings 

    def set_default_role 
    self.role ||= :student 
    end 

    def mailboxer_email(object) 
    email 
    end 

    acts_as_messageable 

end 

Модель Pairing.rb

class Pairing < ActiveRecord::Base 

    has_and_belongs_to_many :supervisor, class_name: 'User' 
    belongs_to :student, class_name: 'User' 

end 

схемы этих моделей (не связанных полей опущены)

create_table "pairings", force: :cascade do |t| 
    t.integer "supervisor_id" 
    t.integer "student_id" 
    t.string "project_title" 
    end 

    add_index "pairings", ["student_id"], name: "index_pairings_on_student_id", unique: true 
    add_index "pairings", ["supervisor_id"], name: "index_pairings_on_supervisor_id" 

create_table "users", force: :cascade do |t| 
    t.string "name" 
    t.string "email",     default: "", null: false 
    t.integer "role" 
    end 

messages_controller.rb

class MessagesController < ApplicationController 
    before_action :authenticate_user! 

    def new 
    @chosen_recipient = User.find_by(id: params[:to].to_i) if params[:to] 
    end 

    def create 
    recipients = User.where(id: params['recipients']) 
    conversation = current_user.send_message(recipients, params[:message][:body], params[:message][:subject]).conversation 
    flash[:success] = "Message has been sent!" 
    redirect_to conversation_path(conversation) 
    end 
end 

messages_helper.rb

module MessagesHelper 
    def recipients_options(chosen_recipient = nil) 
    s = '' 
    User.all.each do |user| 
     s << "<option value='#{user.id}' #{'selected' if user == chosen_recipient}>#{user.name}</option>" 
    end 
    s.html_safe 
    end 
end 

new.html.erb (вид для отправки сообщений)

<% header "Start Conversation" %> 

<%= form_tag messages_path, method: :post do %> 
    <div class="form-group"> 
    <%= label_tag 'message[subject]', 'Subject' %> 
    <%= text_field_tag 'message[subject]', nil, class: 'form-control', required: true %> 
    </div> 

    <div class="form-group"> 
    <%= label_tag 'message[body]', 'Message' %> 
    <%= text_area_tag 'message[body]', nil, cols: 3, class: 'form-control', required: true %> 
    </div> 

    <div class="form-group"> 
    <%= label_tag 'recipients', 'Choose recipients' %> 
    <%= select_tag 'recipients', recipients_options(@chosen_recipient), multiple: true, class: 'form-control chosen-it' %> 
    </div> 

    <%= submit_tag 'Send', class: 'btn btn-primary' %> 
<% end %> 

ответ

0

решается за счет этих изменений

module MessagesHelper 
    def recipients_options(chosen_recipient = nil) 
    s = '' 
    current_id = current_user.id 
    if current_user.try(:student?) 
     User.joins('INNER JOIN "pairings" ON "pairings"."supervisor_id" = "users"."id"').where("pairings.student_id" => current_id).each do |user| 
      s << "<option value='#{user.id}' #{'selected' if user == chosen_recipient}>#{user.name}</option>" 
     end 
    elsif current_user.try(:supervisor?) 
     User.joins('INNER JOIN "pairings" ON "pairings"."student_id" = "users"."id"').where("pairings.supervisor_id" => current_id).each do |user| 
      s << "<option value='#{user.id}' #{'selected' if user == chosen_recipient}>#{user.name}</option>" 
     end 
    else 
     User.all.each do |user| 
      s << "<option value='#{user.id}' #{'selected' if user == chosen_recipient}>#{user.name}</option>" 
     end 

    end 

    s.html_safe 
    end 

end