2

我有一个控制器方法,它返回一个以部分呈现的下拉列表,但根据使用部分的位置,RJS 模板需要不同。我可以将参数传递给将确定使用哪个 RJS 的控制器吗?

这是控制器方法,很简单:

def services
   respond_to do |format|
     format.js {
       @type     = HospitalCriteria.find_by_id(params[:type_id])
       @services = @type.children.all
     }
   end
end

这是自动呈现的 rjs 模板

page.replace_html 'select_service', :partial => 'hospital/services'
page.replace_html 'select_condition', :partial => 'hospital/conditions'
page.replace_html 'select_procedure', :partial => 'hospital/procedures'

page << 'if ($("chosenType") != null) {'
  page.replace_html 'chosenType', @type.name
  page.replace_html 'chosenService', 'Selected Service'
  page.replace_html 'chosenCondition', 'Selected Condition'
  page.replace_html 'chosenProcedure', 'Selected Procedure'
page << '}'
4

4 回答 4

3

我喜欢 Mike 的回答,但从设计的角度来看,这里需要考虑一些事情:

在我看来,这应该在视图层中——如果动作在语义上是相同的,但呈现方式不同,也许有两个不同的 rjs 部分,并且做类似下面的事情更符合 MVC?

if params[:use_alternate]
  render :partial => "case_1.rjs"
else
  render :partial => "case_2.rjs"
end
于 2008-10-10T20:24:05.877 回答
2

将条件逻辑放在一个rjs 模板中怎么样?

# services.rjs

if @type == "your conditions"
  # your rjs updates
else
  # your other rjs updates
end

这为您提供了一个更干净的控制器,并为您省去了维护多个 rjs 模板的麻烦。

于 2008-10-13T09:27:56.103 回答
1

就像是:

if params[:use_alternate]
  render :template => alternate.rjs and return
end
于 2008-10-10T20:03:55.933 回答
0

为了保持干净,我有两个控制器方法来呈现两个不同的 RJS。然后我会在两个控制器方法调用的公共受保护方法中设置@type 和@services。

在我看来,您在每种情况下都要求不同的东西,因此请调用不同的控制器方法。传入一个标志来改变方法的工作方式只是一个技巧,当你有 3、4 或 5 个位置时,它不会很好地扩展。即使您将生成更多代码,它也会更容易维护。

于 2008-10-10T22:12:59.137 回答