我正在尝试将我的帖子标记为某个标记以进行渲染。我在视图中的代码是
查看/帖/ sports.html.erb
<% my_posts = post.find_by_tag("sports") %>
<%= my_posts.each do |post| %>
<%= post.title %><br />
<%= post.body %><br />
<% end %>
我的控制器看起来像
def sports
@posts = Post.paginate(:page => params[:page], :per_page => 10)
@post = Post.find(params[:id])
@title = "Newest"
respond_to do |format|
format.html
format.json { render :json => @users }
end
end
我知道我必须定义@post变量,但我不确定将其定义为什么。
更新
我遇到的问题是“找不到没有ID的帖子”错误
第二次更新
def find_by_tag name
Tag.find_by_name(name).posts
end
答案 0 :(得分:0)
你没有说出了什么问题,你只说出你想要做的事情。
有些事情可以帮助调试你所看到的内容:
<%= debug(params) if Rails.env.development? %>
在你的主布局中,这将转储params哈希,并可能提供线索。
此外,
rake routes
确保您正在寻找正确的参数键。
在您提供的代码段中,您在my_posts.each ...
行前面有一个等号,我不是ERB专家,但我认为您不会想要,而是:
<% my_posts = post.find_by_tag("sports") %>
<% my_posts.each do |post| %>
<%= post.title %><br />
<%= post.body %><br />
<% end %>
答案 1 :(得分:0)
基于此处显示的问题,部分问题是您在控制器中使用Post对象定义实例变量,然后不在视图中的任何内容中使用它们。要检索标记为“sports”的所有帖子的集合,您需要在控制器中执行以下操作:
@sports_posts = Post.find_by_tag("sports")
并在视图中:
<% @sports_posts.each do |post|
etc...
要添加分页,您只需将该方法链接到原始方法:
@sports_posts = Post.find_by_tag("sports").paginate(:page => params[:page],
:per_page => 10)
这与您的片段不同,您的片段定义了一个@posts
变量,它返回10个Post
个对象的集合,而@post
只根据传递的id找到一个post对象通过提交表格params。我的猜测是这个控制器动作不是由表单提交创建的,因此没有传递参数,因此params[:id]
为零,因此您看到错误消息。在任何情况下,除非您在视图中需要这些项目(并且此处没有任何内容表明它们被用于任何事物),否则没有理由创建它们。
您需要的是一系列标记为“sports”的帖子,这就是上述调用所完成的内容。看起来您正试图在视图中使用post.find_by_tag("sports")
执行此操作。问题是您在find_by_tag
上调用post
方法,其中不存在。 Post
存在 - 这是Post类,可能是你打电话的意思。只需将post
更改为Post
,您就可以获得所需的内容,但如果您在控制器中创建对象,然后使用视图简单地呈现其属性数据,则内容检索和呈现会更好地分开(上面的例子。)