2015-08-02 2 views
0

У меня есть совершенно рабочий метод для публикации сообщений:Отсутствует шаблон после respond_to или redirect_to

def new_message 
    #adding message to database 
    tmp_message = Message.new 
    # Check if user is muted 
    if current_user.role == 'muted' 
    params[:message] = "пытался что-то сказать, но кляп оказался  сильнее" 
    end 
    # Check if the message is private 
    if recipient = params[:message].match(/@(.+) (.+)/) 
    # It is private, send it to the recipient's private channel 
    @channel = "/messages/private/#{recipient.captures.first}" 
    @message = { :username => current_user.username, :msg =>  recipient.captures.second } 
    else 
    # It's public, so send it to the public channel 
    @channel = "/messages/public" 
    @message = { :username => current_user.username, :msg =>  params[:message] } 
    end 
    tmp_message.channel = @channel 
    tmp_message.message_text = params[:message] 
    tmp_message.username = current_user.username 
    tmp_message.save 
    respond_to do |f| 
    f.js 
    end 
end 

Затем я copyied этого метода для работы с данными из базы данных:

def get_messages 
for i in 1..Message.count 
    tmp_message = Message.find_by_id(i) 
    if tmp_message 
    if recipient = tmp_message.message_text.match(/@(.+) (.+)/) 
    # It is private, send it to the recipient's private channel 
    @channel = "/messages/private/#{recipient.captures.first}" 
    @message = { :username => tmp_message.username, :msg =>  recipient.captures.second } 
    else 
    # It's public, so send it to the public channel 
     @channel = "/messages/public" 
    @message = { :username => tmp_message.username, :msg =>  tmp_message.message_text } 
    end 
    end 
end 
    respond_to do |format| 
    format.js { render nothing: true } 
    end 

конца

и назвал его в методе «номер»:

def room 
    redirect_to sign_up_path unless user_signed_in? 
    if current_user.email == "[email protected]" 
    current_user.role = "admin" 
    end 
    @queue = Array.new; 
    @queue = queue_list 
get_messages 
end 

get_messages.js выглядит следующим образом:

// Clear message input 
$('#message').val(''); 

// Send the message 
<% publish_to @channel, @message %> 

I`ve пытался добавить "format.html" и получил "Перейти ошибка, отсутствует блок (выход)"

+0

Не могли бы вы попытаться использовать 'render: action =>: get_messages' вместо простого' get_messages' и посмотреть, что произойдет? Это действие, а не метод ... –

+0

@RubyRacer все еще отсутствует шаблон –

ответ

0

трудно проверить свое решение. Тем не менее, я думаю, что проблема заключается в механизме рендеринга того, что вы пытаетесь сделать ... Кроме того, некоторые вещи, которые необходимо учитывать:

  • Если вы хотите запускать методы в своем действии, вы должны оставить рендеринг вне.
  • Вы должны сделать перенаправление в фильтре, а не на потоке действий (см before_action ниже)
  • Вы должны указать рендеринга явно в каждом методе, если вы не хотите иметь значения по умолчанию ..

Чтобы решить эту проблему Я думаю, что некоторые реструктуризации контроллера должны быть в порядке:

before_action :before_room, only: :room 

def get_messages 
    messages 
    respond_to do |format| 
     format.js {render :nothing => true} 
    end 
end 

def room 
    if current_user.email == "[email protected]" 
     current_user.role = "admin" 
    end 
    @queue = Array.new; 
    @queue = queue_list 
    messages 
    respond_to do |format| 
     format.js {render :nothing => true} 
    end 
end 

private: 
def before_room 
    redirect_to sign_up_path unless user_signed_in? 
end 

def messages 
    Message.all.each do |message| # different approach, more "Rails" way 
     if recipient = message.message_text.match(/@(.+) (.+)/) 
     # It is private, send it to the recipient's private channel 
      @channel = "/messages/private/#{recipient.captures.first}" 
      @message = { :username => message.username, 
         :msg => recipient.captures.second } 
     else 
      # It's public, so send it to the public channel 
      @channel = "/messages/public" 
      @message = { :username => message.username, 
         :msg => message.message_text } 
     end 
    end 
end 

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

+0

Ваше решение отлично выглядит, но теперь я получаю ошибку «ActionController :: UnknownFormat». И могу ли я каким-либо образом передать параметры из формы в метод «сообщений», не создавая новый? –

+0

Пожалуйста, могу ли я увидеть полное сообщение об ошибке? И ответ на ваш вопрос, конечно, да, с различными способами (сильные параметры, перед фильтром, inline и т. Д.) –

+0

@RubyRacerActionController :: UnknownFormat Rails.root: C:/Сайты/faye-tutorial приложения/контроллеры /chats_controller.rb:7:in 'get_messages ' –