侧边栏的活动内容

时间:2016-01-28 14:15:46

标签: ruby-on-rails ruby-on-rails-4

我正在编写一个rails应用程序,我打算使用活动内容来至少填写侧栏。具体来说,它意味着显示应用用户发送的最近消息。

现在,我只是试图让侧边栏显示最近的消息,而不管哪个控制器正在处理该页面。

视图/布局/ 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| %>

2 个答案:

答案 0 :(得分:2)

创建一个帮助方法来获取最近的消息并在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

答案 1 :(得分:1)

这里发生的事情是@messages没有定义,当你使用partials时,你需要手动将变量传递给它。您不能只在消息控制器中定义@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变量中使用它:

在您的应用程序助手中 def 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>

另一种方法是在message.rb模型中使用Scope,Scope。

message.rb

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

然后你可以在你的部分中调用Message.get_recent