如何在同一轨道控制器中使用不同的RJS模板?

时间:2008-10-10 18:25:15

标签: ruby-on-rails ruby rjs

我有一个控制器方法,它返回一个下拉列表,该列表在部分中呈现,但根据部分的使用位置,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 个答案:

答案 0 :(得分:3)

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

听起来像这应该在视图层中 - 如果动作在语义上是相同的,但是演示文稿是不同的,可能有两个不同的rjs partials并且执行类似下面的操作更符合MVC?

if params[:use_alternate]
  render :partial => "case_1.rjs"
else
  render :partial => "case_2.rjs"
end

答案 1 :(得分:2)

如何将条件逻辑放在一个 rjs模板中?

# services.rjs

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

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

答案 2 :(得分:1)

类似的东西:

if params[:use_alternate]
  render :template => alternate.rjs and return
end

答案 3 :(得分:0)

为了保持清洁,我有两种控制器方法可以渲染两种不同的RJS。然后我将@type和@services设置为两个控制器方法调用的公共保护方法。

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