将变量发送到视图而不传递两个实例变量

时间:2016-07-13 02:21:53

标签: ruby-on-rails ruby

我希望获得满足特定条件的孩子数量(在这种情况下为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。如何在不向视图发送两个实例变量的情况下将信息提供给视图,或者这是唯一的方法?

2 个答案:

答案 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 %>

是你将它作为自己的变量传递的方式。