我希望获得满足特定条件的孩子数量(在这种情况下为is_confirmed。)这在get_confirmed_amount
中返回:
def get_confirmed_amount(reservations)
amount = 0
reservations.each do |reservation|
if reservation.is_confirmed
reservation.persons.each do
amount = amount + 1
end
end
end
end
然后我从索引操作中调用它:
def index
@reservations = Reservation.where(customer_id: session[:customer_id]).order(:name)
confirmed_amount = get_confirmed_amount(@reservations)
end
然后,我需要将此信息传递给视图,但将其设置为@reservations.confirmed_amount
将返回NoMethodError
。如何在不向视图发送两个实例变量的情况下将信息提供给视图,或者这是唯一的方法?
答案 0 :(得分:3)
正如@okomikeruko所说,在控制器中设置实例变量是访问视图中数据的最简单方法。
如果你真的不想出于某种原因这样做,并假设你也不想改变你的#get_confirmed_amount
方法(我认为这是你控制器中的私有方法,否则一个包含的辅助方法),然后你就可以像你一样在你的控制器中创建一个辅助方法。
protected
def confirmed_amount
return if @reservations.blank?
get_confirmed_amount(@reservations)
end
helper_method :confirmed_amount
你可以做的另一件事是,你可以将confirmed_amount设置为@reservations
关系的一种属性。
class ReservationsView < SimpleDelegator
attr_accessor :confirmed_amount
end
# In your controller action
def index
reservations = Reservation
.where(customer_id: session[:customer_id])
.order(:name)
@reservations = ReservationsView.new(@reservations)
@reservations.confirmed_amount = get_confirmed_amount(@reservations)
end
SimpleDelegator
会将所有未定义的方法传递给Reservation
ActiveRecord::Relation
对象,但允许您通过getter方法访问confirmed_amount
值。所以在视图中你可以做到这一点。
<%= @reservations.confirmed_amount %>
答案 1 :(得分:-1)
设置@
符号可在操作中设置其全局值。
所以:
@confirmed_amount = get_confirmed_amount(@reservations)
和
<%= @confirmed_amount %>
是你将它作为自己的变量传递的方式。