response_with中模型变量的用途

时间:2012-11-07 18:40:18

标签: ruby-on-rails controller instance-variables

在Rails 3中,使用新的respond_to和respond_with构造,我这样做:

class SurveysController < ApplicationController
  respond_to :html

  def survey
    @program_id = params[:program_id]
    @participant_id = params[:participant_id]
    respond_with [@program_id, @participant_id]
  end
end

当显示视图(survey.html.erb)时,变量program_id,@ party_id都正确设置。但是,如果我从respond_with中省略它们,如下所示:

class SurveysController < ApplicationController
  respond_to :html

  def survey
    @program_id = params[:program_id]
    @participant_id = params[:participant_id]
    @foo = "foo"
    respond_with @foo
  end
end

视图中仍然可以看到相同的两个实例变量。换句话说,来自操作的所有实例变量都可以在视图中使用。

问题:我为什么要将实例变量放在respond_to行上?

1 个答案:

答案 0 :(得分:1)

您是正确的,您可以在相应的视图中访问您在操作方法中设置的任何实例变量。在您的情况下,您只是将id设置为实例变量,而不是实际资源(即@survey = Survey.find_by_program_id(params[:program_id])

respond_with将发送一个响应,其中包含您为其提供的资源的相应格式...因此您不会对所有实例变量使用respond_with,而是将其用于资源。如果您添加了:json等其他格式,那么如果请求是survey.json,则respond_with会将您的@survey资源转换为相应的json格式。

respond_to :html, :json
def survey
  @program_id = params[:program_id]
  @participant_id = params[:participant_id]
  @survey = Survey.find_by_program_id(params[:program_id])
  respond_with @survey
end

不确定这对您是否完全合理,但this article可能会有所帮助。