【问题标题】:Couldn't find Post without an ID找不到没有 ID 的帖子
【发布时间】:2012-06-19 00:56:39
【问题描述】:

我正在尝试将我的帖子标记为某个标签以进行渲染。我在视图中的代码是

视图/帖子/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

【问题讨论】:

  • params[:id] 必须为空(nil)?

标签: ruby-on-rails ruby ruby-on-rails-3 tags


【解决方案1】:

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

@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)

这与您的 sn-p 不同,您在其中定义了一个 @posts 变量,该变量返回 10 个 Post 对象的集合,而 @post 仅根据提交表单传递的 id 找到一个 post 对象参数。我的猜测是,此控制器操作不是由表单提交创建的,因此没有传递任何参数,因此 params[:id] 为零,因此您会看到错误消息。无论如何,除非您在视图中需要这些项目中的任何一个(并且这里没有任何内容表明它们被用于任何事情),否则没有理由创建它们。

您需要的是一组标记为“体育”的帖子,这就是上面的调用所完成的。看起来您正试图在视图中使用 post.find_by_tag("sports") 来执行此操作。问题是您在post 上调用find_by_tag 方法,不存在Post 存在 - 那是 Post 类,可能是您要调用的。只需将 post 更改为 Post 可能会让您到达您想要的位置,但是如果您在控制器中创建对象然后使用视图简单地呈现它们的属性数据(根据上面的示例),内容检索和呈现会更好地分开.

【讨论】:

  • 首先,我非常感谢您对我的问题的出色回答。我非常感谢您为帮助我解决问题所付出的详细程度和努力。我尝试了您的解决方案,但收到的新错误是 find_by_tag 未定义。它目前是在我的 Post 模型中定义的,并且调用在我的 show.html.erb 和 _post.html.erb 视图中工作,但由于某种原因,这个控制器不能在这个视图中工作。我将更新我的问题以显示我是如何在我的模型中定义它的。
  • 您使用的是acts_as_taggable_on 还是其他库?如果是这样,它们提供了特定的方法来获取标记有某个值的对象集合。例如acts_as_taggable_on 提供了一个“tagged_with”方法,因此您只需将我上面的第一行替换为@sports_posts = Post.tagged_with("sports").paginate(...),而不是费力想出自己的方法。另请注意,您的方法是不必要的 - Tag.find_by_name("something").posts 将返回与名为“sports”的标签关联的帖子对象的集合,这正是您所需要的。
  • 首先我没有使用acts_as_taggable,我正在处理我在railcasts 中找到的与虚拟属性相关的代码。我找不到合适的教程或解释如何实现acts_as_taggable,所以我决定顺其自然,这是实现的最后一个障碍。
  • 这更难。很抱歉,您没有找到适合您的教程 - 我认为 gem 的自述文件相当不错 - github.com/mbleigh/acts-as-taggable-on,但它确实深入到了复杂的案例中,因此很难看到它在最简单的情况。我真的建议尝试通过它。这里的安装说明 - blog.joshsoftware.com/2009/05/08/… 适用于 Rails 2(使用 Rails 3 的自述说明),但使用部分更简单一些。抱歉,我不能提供更多帮助。
  • 我找到了一个有效的教程,并且能够实现acts-as_taggable-on,因此感谢您让我重新考虑该选项。对于查看此帖子需要帮助的其他任何人,链接是g-p.si/posts/tagging-with-acts-as-taggable-on
【解决方案2】:

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

一些有助于调试所见内容的事情:

<%= debug(params) if Rails.env.development? %>

在您的主布局中,这将转储参数哈希并可能提供线索。

还有,

rake routes

确保您正在寻找正确的参数键。

在您提供的 sn-p 中,my_posts.each ... 行前面有一个等号,我不是 ERB 专家,但我认为您不希望这样,而是这样:

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

【讨论】:

  • 我刚刚更新了这个问题,感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2011-09-07
相关资源
最近更新 更多