2014-02-07 3 views
1

Я использую жемчужину почтового ящика для разговоров/сообщений между моделью пользователя в моем приложении. Все это прекрасно работает, благодаря большой помощи в переполнении стека. Теперь я пытаюсь настроить раздел, чтобы администратор мог просматривать все разговоры, которые происходят.Mailboxer Gem, Admin View

Я создал контроллер и просмотр для разговоров, вложенных в раздел моего администратора. Я вытащил во всех разговорах на индексной странице с:

def index 
    @admin_conversations = Conversation.all 
    end 

Это перечислил все разговоры, и ссылки, чтобы показать каждый разговор, как и ожидалось.

Проблема, с которой я столкнулась, заключается в том, что почтовый ящик Gem настроен так, чтобы позволить current_user просматривать разговоры, в которых участвует current_user. Поэтому я могу щелкнуть некоторые из цепочек (подписано как администратор) и видеть содержимое, но некоторые (которые между другими пользователями тестов) я не могу видеть то, что бросает исключение, такие как:

Couldn't find Conversation with id=5 [WHERE "notifications"."type" = 'Message' AND "receipts"."receiver_id" = 35 AND "receipts"."receiver_type" = 'User'] 

Как я могу определить метод в моем контроллере администратора, так что администратор может видеть все?

настоящее время я использую канкан и позволяет всем 3 пользовательских ролей у меня есть (администратор, клиент и поставщик), как это:

can :manage, Conversation 

... так что это не обычная проблема авторизации.

Вот мой разговор контроллер:

class ConversationsController < ApplicationController 
    authorize_resource 
    helper_method :mailbox, :conversation 


    def create 
    recipient_emails = conversation_params(:recipients).split(',') 
    recipients = User.where(email: recipient_emails).all 

    conversation = current_user. 
     send_message(recipients, *conversation_params(:body, :subject)).conversation 

    redirect_to :back, :notice => "Message Sent! You can view it in 'My Messages'." 
    end 

def count 
    current_user.mailbox.receipts.where({:is_read => false}).count(:id, :distinct => true).to_s 
end  

    def reply 
    current_user.reply_to_conversation(conversation, *message_params(:body, :subject)) 
    redirect_to conversation 
    end 

    def trash 
    conversation.move_to_trash(current_user) 
    redirect_to :conversations 
    end 

    def untrash 
    conversation.untrash(current_user) 
    redirect_to :conversations 
    end 

    private 


    def mailbox 
    @mailbox ||= current_user.mailbox 
    end 

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


    def conversation_params(*keys) 
    fetch_params(:conversation, *keys) 
    end 

    def message_params(*keys) 
    fetch_params(:message, *keys) 
    end 

    def fetch_params(key, *subkeys) 
    params[key].instance_eval do 
     case subkeys.size 
     when 0 then self 
     when 1 then self[subkeys.first] 
     else subkeys.map{|k| self[k] } 
     end 
    end 
    end 
end 

Ответ, вероятно, что-то довольно глупо, но я новичок в этом ...

Благодаря

ответ

1

В вашем методе разговор, ваше призвание mailbox.conversations.find(params[:id])

mailbox.conversations - это то, что ограничивает вас разговорами текущего пользователя.

Попробуйте просто Conversation.find(params[:id])

+0

Хорошо спасибо, это сработало. Я определил его, как вы сказали, в моем контроллере: admin. Единственное, что мне нужно сделать сейчас, это изменить путь к шоу, чтобы включить часть «admin» в ссылке. В настоящее время он переходит к root/conversation/id, и мне нужен root/admin/conversation/id –