我正在编写一个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| %>
答案 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
。