【问题标题】:Looping through a controller instance variable in a view in Rails在 Rails 的视图中循环访问控制器实例变量
【发布时间】:2015-01-20 18:08:39
【问题描述】:

我对 Rails 很陌生,正在开发一个显示每日提交的应用程序。我现在正在尝试显示每天的帖子。所以我做了几件事:

将控制器实例变量设置为单个@submissions,它接受“num_days_ago”输入:

@num_days_ago = 1 
@submissions = Submission.daily(@num_days_ago).paginate(page: params[:page], per_page: 10).order('rank DESC')

设置范围以响应 num_days_ago 输入:

scope :daily, -> (num) { where( created_at: (num.days.ago.beginning_of_day..num.days.ago.end_of_day)) }

添加了一些辅助方法来处理视图中的日期:

module WelcomeHelper

  def the_date(num_days)
    date = num_days.days.ago.to_date
    date.to_formatted_s(:long_ordinal)   end

  def num_days_since_first_day
    (Date.today - (Submission.last.created_at).to_date ).to_i   end

end

在视图中创建了一个循环,使其显示所有每日帖子(稍后我将添加分页和无限滚动):

 <div class="container">
      <% (0..num_days_since_first_day).each do |num| %>
        <h3><%= the_date(num) %></h3>
        <ul>
        <%= render @submissions %>
        </ul>  
      <div id="show_more">
        <%= link_to 'Show More', welcome_index_path(page: 2), class: "show_more_link", remote: true %>
      </div>
      <% @num_days_ago +=1 %>
      <% end %>
</div>

此外,这里是在索引视图中显示的提交部分:

<li>
  <%= render partial: 'votes/voter', locals: { submission: submission } %>
  <%= submission.title %></br>  
  <%= submission.description %> | $<%= submission.price %> | <b><%= submission.merchant.name %></b> | Submitted by: <%= submission.user.name %>
</li>
</br>

所以现在,我遇到的问题是@submissions 实例变量将始终是第一天。所以我试图弄清楚如何让它响应 @num_days_ago ,它在 leach 循环之后被更新 += 1 。关于如何实现这一点的任何建议?

现在,它显示的是自创建帖子的第一天以来所有有帖子的日子,但每天显示的帖子都是第一天创建的 12 个帖子。

【问题讨论】:

    标签: ruby-on-rails view controller bloc.io


    【解决方案1】:

    @submissions 总是显示第一天的提交,因为在控制器中初始化它之后你从未更改过它。在视图中增加 @num_days_ago 没有任何作用,因为视图不使用它。

    如果要显示第一天以来的提交,则需要将第一天的提交数组设置为@submissions。

    @submissions = num_days_since_first_day.times.map do |num_days_ago| 
      Submission.daily(num_days_ago).paginate(page: params[:page], per_page: 10).order('rank DESC')
    end
    

    并在您在视图中迭代时渲染它们中的每一个。

    <%= render @submissions[num] %>
    

    我觉得你可以去掉一些多余的代码,进一步重构上面的代码,但这是基本思路。

    【讨论】:

    • 我认为这绝对是在正确的道路上。实施后我收到'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path. 错误。我认为这与我试图渲染@submissions[num] 的事实有关。 @submissions[num] 似乎与我之前的 @submissions 不同类型的对象。
    • 我猜有些日子没有提交,因此@submissions[num] 为零。在渲染之前添加next unless @submissions[num].present? 可能会解决问题。
    • 成功了。我的设置方式似乎很脆弱,但现在可以使用!
    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2017-02-18
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多