Ruby on rails 不能';我找不到没有身份证的帖子

Ruby on rails 不能';我找不到没有身份证的帖子,ruby-on-rails,ruby,ruby-on-rails-3,tags,Ruby On Rails,Ruby,Ruby On Rails 3,Tags,我正试图让我的文章带有一个特定的标签来呈现。我在视图中的代码是 Views/posts/sports.html.erb <% my_posts = post.find_by_tag("sports") %> <%= my_posts.each do |post| %> <%= post.title %><br /> <%= post.body %><br /> <% end %> 我知道我

我正试图让我的文章带有一个特定的标签来呈现。我在视图中的代码是

Views/posts/sports.html.erb

 <% my_posts = post.find_by_tag("sports") %>
 <%= my_posts.each do |post| %>
    <%= post.title %><br />
    <%= post.body %><br />
 <% end %>
我知道我必须定义@post变量,但我不确定该定义什么

更新

我遇到的问题是“找不到没有ID的帖子”错误

第二次更新

   def find_by_tag name 
     Tag.find_by_name(name).posts 
   end

你不说哪里出了问题,你只说你想做什么

以下几点有助于调试您看到的内容:

<%= debug(params) if Rails.env.development? %>
确保您正在查找正确的参数键

在您提供的代码片段中,在
my_posts前面有一个等号。每…
行,我不是ERB专家,但我想您不会想要这样,而是:

<% my_posts = post.find_by_tag("sports") %>
<% my_posts.each do |post| %>
  <%= post.title %><br />
  <%= post.body %><br />
<% end %>




根据此处显示的内容,部分问题在于您正在控制器中使用Post对象定义实例变量,然后在视图中不使用它们。要检索标记为“sports”的所有帖子的集合,请在控制器中执行以下操作:

@sports_posts = Post.find_by_tag("sports")
并且认为:

<% @sports_posts.each do |post|
  etc...
这与代码段不同,在代码段中定义了一个
@posts
变量,该变量返回10个
Post
对象的集合,而
@Post
则根据提交表单参数传递的id查找Post对象。我的猜测是,此控制器操作不是通过表单提交创建的,因此没有传递任何参数,因此
params[:id]
为零,因此您会看到错误消息。无论如何,除非您在视图中需要这些项目中的任何一个(并且这里没有任何迹象表明它们被用于任何用途),否则没有理由创建它们


你真正需要的是一个标记为“运动”的帖子集合,这就是上面的调用所实现的。看起来您正试图使用
post.find by_tag(“sports”)
在视图中查找。问题是您正在调用
post
上的
find\u by_标记
方法,该方法不存在
Post
存在-这就是Post类,可能就是您要调用的。只需将
post
更改为
post
就可以达到您想要的目的,但如果您在控制器中创建对象,然后使用视图简单地呈现其属性数据,则内容检索和显示会更好地分开(根据上面的示例)。

params[:id]必须为空(nil)?我刚刚更新了这个问题,谢谢你指出这一点。首先,我想非常感谢你对我的问题给出了很好的回答。我非常感谢您为帮助我解决问题所付出的细致和努力。我尝试了您的解决方案,但收到的新错误是未定义find_by_标记。它当前是在我的Post模型中定义的,调用在我的show.html.erb和_Post.html.erb视图中工作,但由于某些原因,此控制器在该视图中不工作。我将更新我的问题,以显示我是如何在模型中定义它的。您使用的是acts_as_taggable_on还是其他库?如果是这样的话,它们提供了特定的方法来获取标记了某个值的对象集合。例如,acts_as_taggable_on提供了一个“tagged_with”方法,因此您只需将我上面的第一行替换为
@sports_posts=Post.tagged_with(“sports”).paginate(…)
,而不必费事想出自己的方法。另外请注意,您的方法是不必要的-
标记。按名称(“某物”)查找。posts
将返回与名为“sports”的标记相关联的posts对象集合,这正是您所需要的。首先,我没有使用acts作为标记,我正在使用Railcast中找到的与虚拟属性相关的代码。我找不到一个合适的教程或解释如何实现acts_as_taggable,所以我决定采用这种方式,这是实现的最后一个障碍。这更难。很抱歉,您没有找到适合您的教程-我认为《创业板自述》相当不错-但它确实深入到复杂的案例中,因此不容易看到它在最简单的案例中是如何工作的。我真的建议你试着度过难关。这里的安装说明是针对Rails2的(使用Rails3的自述说明),但是关于用法的部分更简单。很抱歉,我帮不上什么忙。我找到了一个有用的教程,能够实现acts-as_-taggable-on,所以谢谢你让我重新考虑这个选项。对于任何其他看这篇文章需要帮助的人,链接是
@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)