RoR:枚举,如何基于它们列出邮件的收件人

时间:2016-09-20 12:01:23

标签: ruby-on-rails ruby enums

我有一个允许用户向其他用户发送消息的应用程序。我在用户rb-老师和学生中有两种用户类型定义为枚举:

enum access_level: [:student, :teacher]

我想知道如何让所需的收件人出现在视图(下方)的列表中,以便教师只能发送给学生或反过来。

在我的消息控制器中,我有:

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

我的对话控制器:

class ConversationsController < ApplicationController
  before_action :authenticate_user!
  before_action :get_mailbox
  before_action :get_conversation, except: [:index, :empty_trash]
  before_action :get_box, only: [:index]

  def index
    if @box.eql? "inbox"
      @conversations = @mailbox.inbox
    elsif @box.eql? "sent"
      @conversations = @mailbox.sentbox
    else
      @conversations = @mailbox.trash
    end

    @conversations = @conversations.paginate(page: params[:page], per_page: 10)
  end

  def show
  end

  def mark_as_read
    @conversation.mark_as_read(current_user)
    flash[:success] = 'The conversation was marked as read.'
    redirect_to conversations_path
  end

  def reply
    current_user.reply_to_conversation(@conversation, params[:body])
    flash[:success] = 'Reply sent'
    redirect_to conversation_path(@conversation)
  end

  def destroy
    @conversation.move_to_trash(current_user)
    flash[:success] = 'The conversation was moved to trash.'
    redirect_to conversations_path
  end

  def restore
    @conversation.untrash(current_user)
    flash[:success] = 'The conversation was restored.'
    redirect_to conversations_path
  end

  def empty_trash
    @mailbox.trash.each do |conversation|
      conversation.receipts_for(current_user).update_all(deleted: true)
    end
    flash[:success] = 'Your trash was cleaned!'
    redirect_to conversations_path
  end

  private

  def get_mailbox
    @mailbox ||= current_user.mailbox
  end

  def get_conversation
    @conversation ||= @mailbox.conversations.find(params[:id])
  end

  def get_box
    if params[:box].blank? or !["inbox","sent","trash"].include?(params[:box])
      params[:box] = 'inbox'
    end
    @box = params[:box]
  end
end

我的观点(messages / _form.html.erb):

<%= 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 %>

如何根据与用户关联的枚举属性显示列表?例如,老师只能看到学生。

感谢任何指导。感谢。

3 个答案:

答案 0 :(得分:1)

这是enum给出的方法,

class User < ActiveRecord::Base
  enum access_level: [ :student, :teacher ]
end


user.student!
user.student? # => true
user.access_level  # => "student"

user.teacher!
user.teacher? # => true
user.access_level  # => "teacher"

所以你可以使用,

def new
  if params[:to].present?
   render text: params and return false
    @chosen_recipient = current_user.student? ? check_access_level('teacher') : check_access_level('student')
  end 
end

private

def check_access_level(access_level)
  User.where(id: params[:to].to_i, access_level: access_level)
end

答案 1 :(得分:0)

试试这个,

def new
  @chosen_recipient = current_user.student? (User.where(id: params[:to].to_i, access_level: 1)) : current_user.teacher? (User.where(id: params[:to].to_i, access_level: 0)) if params[:to]
end

答案 2 :(得分:0)

您是否尝试更改生成所选收件人的方法?在helpers / messages_helpers.rb中,按如下方式更改方法:

User.teacher.each do |user|
     s << "leave this the way it is"
   end

您也可以按照Navin的建议进行操作,并检查当前用户是否为教师。我只想把变量如下

 if user.teachers?
     reciepients = User.all
  else
   reciepients = User.teachers? 
  end

然后我们可以这样做:

recipients.each do |user|
     s << "leave this the way it is"
   end

希望指出你正确的方向。