在 Rails 的视图中循环遍历控制器实例变量
Looping through a controller instance variable in a view in Rails
我是 rails 的新手,正在开发一个可以显示每日提交的应用程序。我现在正在尝试每天显示 posts。所以我做了一些事情:
将控制器实例变量设置为单个@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
在视图中创建了一个循环,使其每天显示 post 秒(稍后我将添加分页和无限滚动):
<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 ,它在浸出循环后被更新 += 1 。关于如何实现这一点有什么建议吗?
现在,它显示的是自创建 post 的第一天以来 post 的所有天数,但每天显示的 post 都是第一天创建的 12 post。
@submissions 总是显示第一天的提交,因为你在controller里初始化之后就没再改过。在视图中递增 @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] %>
我认为你可以删除一些冗余代码并进一步重构上面的代码,但这是基本的想法。
我是 rails 的新手,正在开发一个可以显示每日提交的应用程序。我现在正在尝试每天显示 posts。所以我做了一些事情:
将控制器实例变量设置为单个@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
在视图中创建了一个循环,使其每天显示 post 秒(稍后我将添加分页和无限滚动):
<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 ,它在浸出循环后被更新 += 1 。关于如何实现这一点有什么建议吗?
现在,它显示的是自创建 post 的第一天以来 post 的所有天数,但每天显示的 post 都是第一天创建的 12 post。
@submissions 总是显示第一天的提交,因为你在controller里初始化之后就没再改过。在视图中递增 @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] %>
我认为你可以删除一些冗余代码并进一步重构上面的代码,但这是基本的想法。