【问题标题】:Error while rendering partial using escape_javascript in Rails?在 Rails 中使用 escape_javascript 渲染部分时出错?
【发布时间】:2020-04-03 18:37:01
【问题描述】:

我的 Rails 应用程序中有一个 Search 选项卡,它显示此表单:

搜索/_form.html.erb

<%= form_for :anything, remote: true, html: { id: 'search_form' } do |f| %>
<div class="form-border">
  <div class="container-fluid"><!-- Row 2 -->
    <div class="row">
      <!-- 1. Add "Entity" multiselect dropdown to the form -->
      <div class="col-lg-4" id="userFormColumn2">
        <div class="form-group">
          <br/> <br/>
          <b><%= label_tag "Entity" %><br/></b>
          <%= select_tag(:search_entity, options_for_select(Account.uniq.pluck(:entity)), :multiple => true) %>
          <br/><br/>
        </div>

        <!-- 2. Add "Financial Institution" multiselect dropdown to the form -->
        <div class="col-lg-4" id="userFormColumn1">
          <div class="form-group">
            <%if(!@search_financial_institutions.blank?)%>
            <%= f.label :financial_institution %>
            <br/>
            <%= f.select :search_financial_institution, options_for_select(@search_financial_institutions.collect{ |f| [f.financial_institution, f.financial_institution] }, 1 ), {}, { id: 'search_financial_institution' } %>
            <%else%>
            <%= f.label :financial_institution %>
            <br/>              
            <%= f.select :search_financial_institution, options_for_select([['-Select-', '']]), {}, { id: 'search_financial_institution', class: 'input_form' } %>
            <%end %>
          </div>  
        </div>

      </div>
    </div>
  </div>
<%end%>


<!-- Javascript code to handle events for dropdowns in the above form-->

<script type='text/javascript'>
  /* When user changes value of "Entity" dropdown, do the needful to update
   * the "Financial Institutions" dropdown
   */
   $(document).on("change", "#search_entity", function(event){
    $.ajax('update_search_financial_institutions', {
      type: 'GET',
      dataType: 'script',
      data: {
        search_entity: $("#search_entity").val()
      },
      error: function(jqXHR, textStatus, errorThrown) {
        return console.log("AJAX Error: " + textStatus);
      }
    });
  });
</script>

正如您在上面看到的,我们有 2 个下拉菜单 - 当第一个 (Entity) 下拉菜单的值发生变化时,应根据第一个下拉菜单的选择修改第二个 (Financial Institution) 下拉菜单的值

这是我的routes.rb 条目:

routes.rb

  get "/update_search_financial_institutions" => "search#update_financial_institutions", :as => :update_search_financial_institutions

这是我的控制器函数,当第一个下拉列表的值发生变化时会调用它:

search_controller.rb

  def update_financial_institutions
    logger.info "SearchController update_search_financial_institutions"

    @search_financial_institutions = Account.where(:entity => params[:search_entity])
    render :partial => 'search/update_financial_institutions.js.erb'
  end  

这些是我的相关部分:

搜索/update_financial_institutions.js.erb

$("#search_financial_institution").empty().append("<%=escape_javascript(render(:partial => 'search/empty')) %>").append("<%=escape_javascript(render(:partial => 'search/financial_institution', :locals => {:institutions => @search_financial_institutions} )) %>");

搜索/_financial_institution.html.erb

<option><%=institutions.financial_institution%></option>

执行上面显示的最后一个部分时出现此错误:

错误

ActionView::Template::Error (undefined method `financial_institution' for #<Account::ActiveRecord_Relation:0x00007f65fb49a1c0>):
    1: <option><%=institutions.financial_institution%></option>

app/views/search/_financial_institution.html.erb:1:in `_app_views_search__financial_institution_html_erb___881295623429985414_70037991679400'
app/views/search/_update_financial_institutions.js.erb:1:in `_app_views_search__update_financial_institutions_js_erb___1405969071861178528_70037991897300'
app/controllers/search_controller.rb:15:in `update_financial_institutions'

但是当我在search_controller 中检查@search_financial_institutions 时,我看到名为financial_institution 的列在其中存在很多。

那我为什么会收到这个错误?

【问题讨论】:

    标签: ruby-on-rails partials


    【解决方案1】:

    您的 @search_financial_institutions 变量是一个 Active Record 关系,一个记录的集合。您尝试在该集合上调用 financial_institution,但该集合不响应该方法,该集合中的单个记录会响应。

    如果您想显示集合中的每条记录,请尝试将您的 search/_financial_institution.html.erb 文件更改为:

    <% institutions.each do |institution| %>
      <option><%=institution.financial_institution%></option>
    <% end %>
    

    【讨论】:

    • 这就像一个魅力!非常感谢!我不知何故被误导相信当js.erb 调用html.erb 时会自动发生这种迭代。显然我错了!感谢您清除它!
    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 2010-12-09
    • 1970-01-01
    • 2023-03-31
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多