2016-01-28 5 views
0

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

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

просмотров/макеты/application.html.erb

<!DOCTYPE html> 
<html lang="en"> 
    <%= render 'layouts/head' %> 
    <body> 
    <%= render 'layouts/nav' %> 

    <div class="container"> 
     <div class="row"> 
     <%= render 'shared/sidebar_users' %> 

     <div class="col-lg-6"> 
      <%= bootstrap_flash %> 
      <%= yield %> 
     </div> 

     <%= render 'shared/sidebar_messages' %> 
     </div><!--/row--> 

     <%= render 'layouts/footer' %> 
    </div> <!-- /container --> 

    <%= render 'layouts/debug' %> 
    </body> 
</html> 

просмотров/общий/_sidebar_messages.html.erb

<div class="col-lg-3"> 
    <div class="well sidebar-nav"> 
    <h3>Recent Posts</h3> 

    <%= render partial: "messages/messages", locals: { display_actions: false } %> 
    </div><!--/.well --> 
</div><!--/span--> 

просмотров/сообщений/_messages.html.erb

<table> 
    <thead> 
    <tr> 
     <th>Creator</th> 
     <th>Content</th> 
     <% if @display_actions %> 
     <th colspan="3">Actions</th> 
     <% end %> 
    </tr> 
    </thead> 

    <tbody> 
    <% @messages.each do |message| %> 
     <tr> 
     <td><%= message.creator.full_name %></td> 
     <td><%= message.content %></td> 
     <% if display_actions %> 
      <td><%= link_to 'Show', message %></td> 
      <td><%= link_to 'Edit', edit_message_path(message) %></td> 
      <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     <% end %> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

Обратите внимание, что код разрывается в этой строке, указывая, что @messages равно нулю и, следовательно, не имеет каждого метода.

<% @messages.each do |message| %> 
+0

Сообщите нам, если один из приведенных ниже ответов полезен для вас. – SsouLlesS

+1

@SsouLlesS сделаю. – Nuclearman

ответ

1

Ну, что происходит здесь в том, что @messages не определен, когда вы работаете с частичными, которые нужно передать переменные вручную к нему. Вы не можете просто определить переменную экземпляра @messages в контроллере сообщений и ожидать, что будете работать повсюду.

Если ваши сообщения всегда имеют одну и ту же логику, независимо от контроллера, то вы можете определить его в контроллере приложения, так он будет доступен через Ваш взгляд действие:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :set_messages 

    private 
    def set_var 
    @messages = #Logic here for get the messages 
    end 
end 

Тогда в любом виде действия вы хотите сделать боковая панель вам нужно передать переменную:

<%= render 'shared/sidebar_messages', messages: @messages %> #Note that you do not need to use locals anymore in rails 4 

и, конечно, в боковой панели Пропустите messages к _messages.html.erb

Другой подход заключается в создании помощника и использовать его в вашем парциальное вместо @messages переменной:

в вашем помощнике приложений Защиту get_messages_for_sidebar #Here вы можете получить возвращения сообщения, как вы хотите. конец

Затем в _messages.html.erb частичному вызвать помощник:

<table> 
    <thead> 
    <tr> 
     <th>Creator</th> 
     <th>Content</th> 
     <% if display_actions %> 
     <th colspan="3">Actions</th> 
     <% end %> 
    </tr> 
    </thead> 

    <tbody> 
    <% get_recent_messages.each do |message| %> 
     <tr> 
     <td><%= message.creator.full_name %></td> 
     <td><%= message.content %></td> 
     <% if display_actions %> 
      <td><%= link_to 'Show', message %></td> 
      <td><%= link_to 'Edit', edit_message_path(message) %></td> 
      <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     <% end %> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

Другой подход заключается в использовании Scope, область применения в модели message.rb.

в вашем message.rb

scope :get_recent, -> { order(created_at: :desc).limit(10) } #get the last 10 most recent 

И тогда вы можете просто позвонить Message.get_recent в вашей частичной.

+0

Часть AJAX, это еще одна тема, пожалуйста, создайте еще один вопрос и вставьте ссылку здесь, я отвечу вам. – SsouLlesS

2

Создайте метод Helper, чтобы получить Последние сообщения и вызова, что в views/messages/_messages.html.erb

в вашем application_helper добавить метод, возвращающий Последние сообщения, например

def get_recent_messages 
    #What ever the logic is to get recent messages i-e Message.order('created_at desc').limit(10) 
end 

Тогда в вашем Partial

<table> 
    <thead> 
    <tr> 
     <th>Creator</th> 
     <th>Content</th> 
     <% if display_actions %> 
     <th colspan="3">Actions</th> 
     <% end %> 
    </tr> 
    </thead> 

    <tbody> 
    <% (@messages || get_recent_messages).each do |message| %> 
     <tr> 
     <td><%= message.creator.full_name %></td> 
     <td><%= message.content %></td> 
     <% if display_actions %> 
      <td><%= link_to 'Show', message %></td> 
      <td><%= link_to 'Edit', edit_message_path(message) %></td> 
      <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     <% end %> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

Во-вторых Вы можете создать имя scope в message.rb получить последние сообщения, а затем вызвать, что в вашем парциальное как Message.recent

Смежные вопросы