0

我正在尝试为我的应用程序构建一个“精选帖子”功能。我有一个posts带有列的表feature_date。我正在努力做到这一点,以便您可以点击结构化的 URL/year/month/date并显示与 URL 中的日期匹配的 feature_date 的所有条目。

routes.rb正在正确路由到帖子控制器:

match "/:year/:month/:day", to: 'posts#index', via: 'get', :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ }, :as => 'post_date'

但是,我认为我没有post_controller.rb正确使用:

def index
  @date = params[:year].to_s + "/" + params[:month].to_s + "/" + params[:day].to_s
  @featured_posts = Post.find_by(feature_date: @date)
end

这似乎太不优雅了,不能成为 Ruby 中的正确方法。

我的观点正在打破,但我认为它来自控制器:

<% @featured_posts.each do |post| %>
<tr>
  <td><%= post.title %></td>
  <td><%= post.url %></td>
  <td><%= post.user.name %></td>
  <td><%= link_to 'Delete', post_path(post), method: :delete, data: { confirm: "Are you sure?" } %></td>
</tr>
<% end %>

它抛出的错误是undefined method 'each' for #<Post:0x007f94393bc7a0>,但我相信这是因为@featured_posts正在返回nil(我不确定如何确认,这似乎是 .each 是未定义方法的原因)。

4

1 回答 1

0

这是因为@featured_posts = Post.find_by(feature_date: @date)返回单个记录,而不是您预期的记录数组。这不是因为@featured_posts 为 nil,否则错误将是 NilClass 的未定义方法“每个”。您可以使用Post.find(:all, :conditions => {featured_date: @date},但这会在 Rails 4 中给出弃用警告,因此会Post.all(:conditions => {featured_date: @date})

要解决这个问题,请改用它。

@featured_posts = Post.where(featured_date: @date).to_a

.to_a 使它肯定返回一个数组。

于 2013-08-26T01:00:54.950 回答