使用变量指定要渲染的部分rails名称

时间:2011-07-21 03:16:15

标签: jquery ruby-on-rails ruby ajax ruby-on-rails-3

在Rails 3.0中是否可以渲染部分名称存储在变量中的部分?

我正尝试类似的事情:

<%= escape_javascript(raw render :partial => @partial_name, :locals => { :value => @value} )%>

更新了更多详情

在我的应用程序中,我有一组使用多表继承的模型,例如假设我有一个基本模型'cupcake'和变体,如'AwesomeCupcake'和'AlrightCupcake'。

这些模型中的每一个都有自己的自定义部分用于显示信息并遵循命名方案:'_awesome_cupcake'和'_alright_cupcake'。

在页面上,我有链接到每种类型的蛋糕,我希望控制器接受参数并动态地导出要呈现的部分。如果(在new.js.erb文件中)我用'awesome_cupcake'之类的东西替换'@partial_name',下面的工作正常。

以下是有关我的组件布局方式的更多信息:

的application.js

$('#set_cupcake').click(function () {
   $.getScript('/cupcakes/new.js?cupcake_type=awesome');
});

cupcakes_controller.rb

def new
   cupcake_type = "#{params[:cupcake_type].capitalize}Cupcake"

   if Object.const_defined? cupcake_type
     @cupcake = cupcake_type.constantize.new
     @partial_name = "#{params[:cupcake_type]}_cupcake"
   end
end

视图/蛋糕/ new.js.erb

$('#cupcakes')
  .append("<%= escape_javascript(raw render :partial => @partial_name, :locals => { :cupcake => @cupcake } ) %>")

3 个答案:

答案 0 :(得分:1)

当然。确保@partial_variable是一个名称的字符串(例如“header”,它将正常工作。

答案 1 :(得分:1)

所以我终于找到了问题所在。在我的控制器中,我将@partial_name设置在检查特定模型是否存在的条件范围内。

我没有意识到使用Object.const_defined?由于模型最初并未全部加载,因此在开发模式下并不适用于rails。我发现的另一种方法是使用ActiveRecord :: Base.connection.tables搜索数据库表连接列表。

但是我认为更好的解决方案是存储一些“注册”此参数的可接受值的文件。

答案 2 :(得分:0)

如果这不起作用,您能否准确地向我们展示@partial_name包含的内容?你得到什么错误?

确保省略前导下划线以及文件扩展名。

例如:要渲染'_myPartial.html.erb',@ partial_name应为“myPartial”。