【发布时间】:2010-12-19 08:40:59
【问题描述】:
我是 Rails 新手,所以请原谅任何简单的问题。我已经开发了一个博客,并且正在做一些定制。只是好奇,如果我想在我的 index.html.erb 页面上呈现一个特定的帖子是可能的。例如,如果我创建一个帖子,标题:Cool Post,并且它在表中的 post_id 为 25,我可以在我的索引页面中调用该特定帖子来呈现吗?
【问题讨论】:
标签: ruby-on-rails ruby blogs render
我是 Rails 新手,所以请原谅任何简单的问题。我已经开发了一个博客,并且正在做一些定制。只是好奇,如果我想在我的 index.html.erb 页面上呈现一个特定的帖子是可能的。例如,如果我创建一个帖子,标题:Cool Post,并且它在表中的 post_id 为 25,我可以在我的索引页面中调用该特定帖子来呈现吗?
【问题讨论】:
标签: ruby-on-rails ruby blogs render
很难准确地说出您的系统是如何设置的,但在 Rails 中“正确”的做法是为您的页面执行类似于 Controller 中的操作:
def index
@post = Post.find(25)
... Your other code here ...
end
您可以在index.html.erb 中输出帖子:
<h2><%= h(@post.title) %></h2>
<%= h(@post.body) %>
当然,我完全猜测您@post 上的字段
编辑:如果您只想渲染@post,您仍然需要检索要在控制器中渲染的帖子,但是您将需要使用部分渲染它来自index.html.erb 文件:
假设,在您的 app/views/posts/ 目录中创建一个 _post.html.erb 文件,并在其中放置您想要的任何渲染代码(或从现有的 app/views/posts/index.html.erb 文件中抽象它。_注意:请参阅部分中的帖子使用局部变量 post 而不是 @post 以获得最大的灵活性。
然后在您的index.html.erb 中调用它,如下所示:
此调用假定 index.html.erb 文件与 _post.html.erb 部分文件不在同一目录中。
【讨论】:
Post.find(25) 之后,输出h 的更简洁的方法是<%=h @post.something %>。否则这很好。
我认为他的问题是关于渲染/重定向。 您应该这样做(作为控制器的最后一行)
render @post
或
redirect_to @post
第一个显示帖子,第二个显示创建/更新后的帖子。
【讨论】:
虽然 dcneiner 的解决方案在技术上是正确的,但 Rails 的方式不是硬编码这些东西。博客投入使用后,您必须直接修改源代码才能更改此帖子。不建议这样做。
我建议您在帖子表中添加一个额外的列,以指示帖子是否应永久显示在首页上。这使您可以在创建永久帖子时动态更新您的永久帖子。
例如:
class Post < ActiveRecord
named_scope :featured, :conditions => {:featured => true},
:order => "created_at DESC"
end
Post.featured 将返回您的精选帖子以在您的首页上使用,按最新到最旧的顺序排列。
如果您一次只想要一个精选帖子,您可以将以下内容添加到帖子模型中
before_validation :highlander_clause
def highlander_clause
Post.featured.each{|p| p.update_attribute(:featured, false) if featured
end
【讨论】: