在javascript模板中使用Rails的视图助手

时间:2012-11-13 12:30:45

标签: javascript ruby-on-rails template-engine form-helpers eco

我希望能够在我的javascript模板中使用一些rails的视图并形成帮助,例如<%= image_tag .. %><%= select_tag .. %>。我读了this thread,建议将erb预渲染为某个javascript变量中的字符串,然后从模板中调用它(它必须在调用js模板之前可用)。所以我可以这样做:

view_helpers.js.erb

<script type="text/javascript">
  var ViewHelpers = {
      CountrySelect: "<%= select_tag "person[country_id]", options_from_collection_for_select(Country.all, "name", "id"), :prompt => '-Country-' %>"
  };
</script>

然后从我的eco模板中调用它(稍后再现):

edit_person.jst.eco

...
<p>
  <label for="person_country_id">Country</label>
  <%= ViewHelpers.CountrySelect %>
</p>
...

但是,我似乎无法将其作为视图的一部分或使用资产管道加载:

资产管道:application.js

(保存在app / assets / javascripts / views / people / view_helpers.js.erb)

//= require ./views/people/view_helpers

或者

ERB模板:views / people / index.html.erb

(保存在app / views / people / view_helpers.js.erb中)

<%= render :template => 'people/view_helpers' %>

我是否完全错误地解决了这个问题,或者我错过了什么?感谢。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。你甚至可以将它用于部分:

update_js.js.erb:

$('#element').html('<%= escape_javascript(render(:partial => @partial, :locals => {:my_var => @item })) %>');

在控制器中你应该有格式js

   respond_to do |format|
      format.js do
        render :update_js do |page|
          page.replace_html "element", :partial => @partial
        end
      end
    end

如果您想通过AJAX调用此js,只需将:remote => true传递给您的链接

即可
<%= link_to 'replace content', item_path(@item), :remote => true %>