ActionView :: Template :: Error(未定义的方法`strip!' for nil:NilClass)

时间:2015-07-01 16:08:05

标签: ruby-on-rails ruby

当我插入超过100,000条记录时,我似乎遇到了这个错误。我知道它可以支持更多的方式。错误在下面,是相关类的代码。

2015-07-01 08:14:24.512:INFO:/:Started GET "/search?type=digital_object" for 129.118.15.44 at 2015-07-01 08:14:24 -0500|
2015-07-01 08:14:24.512:INFO:/:Processing by SearchController#search as HTML|
2015-07-01 08:14:24.512:INFO:/:  Parameters: {"type"=>"digital_object"}|
Jul 01, 2015 8:14:24 AM org.apache.solr.core.SolrCore execute
INFO: [collection1] webapp= path=/select params={facet=true&sort=title_sort+asc&facet.limit=100&qf=four_part_id^3+title^2+finding_aid_filing_title^2+fullrecord&wt=json&rows=10&defType=edismax&pf=four_part_id^4&start=0&q=*:*&facet.field=repository&facet.field=primary_type&facet.field=subjects&facet.field=source&facet.field=linked_agent_roles&fq=types:("digital_object")&fq=-exclude_by_default:true&fq=publish:true} hits=203799 status=0 QTime=15 
2015-07-01 08:14:24.590:INFO:/:  Rendered G:/archivesspace/plugins/vva/public/views/search/_components_switch.html.erb (15.0ms)|
2015-07-01 08:14:24.590:INFO:/:  Rendered search/_filter.html.erb (0.0ms)|
2015-07-01 08:14:24.606:INFO:/:  Rendered search/_pagination_summary.html.erb (16.0ms)|
2015-07-01 08:14:24.637:INFO:/:  Rendered search/_inline_results.html.erb (47.0ms)|
2015-07-01 08:14:24.637:INFO:/:  Rendered search/results.html.erb within layouts/application (62.0ms)|
2015-07-01 08:14:24.653:INFO:/:Completed 500 Internal Server Error in 141.0ms|
2015-07-01 08:14:24.653:INFO:/:|ActionView::Template::Error (undefined method `strip!' for nil:NilClass):|    
17:           <% elsif result["primary_type"] === "repository" %>|    
18:             <%= link_to result['title'], :controller => :search, :action => :repository, :repo_id => id %>|    
19:           <% else %>|    
20:             <%= link_to title_or_finding_aid_filing_title( result )  , :controller => :records, :action => result["primary_type"], :id => id, :repo_id => repo_id %>|    
21:           <% end %>|    
22:         </h3>|    
23:         <div class="result-summary">|  app/helpers/application_helper.rb:22:in `title_or_finding_aid_filing_title'|  
app/views/search/_inline_results.html.erb:20:in `_app_views_search__inline_results_html_erb___996910774_15116'| 
app/views/search/_inline_results.html.erb:5:in `_app_views_search__inline_results_html_erb___996910774_15116'|  
app/helpers/application_helper.rb:134:in `render_aspace_partial'|  
app/views/search/results.html.erb:13:in `_app_views_search_results_html_erb__332589766_15048'|  
app/controllers/search_controller.rb:21:in `search'|  
app/controllers/search_controller.rb:20:in `search'|||

_inline_results.html.erb

<div class="search-results">
<% if search_data.results? %>
  <%= render_aspace_partial :partial => "search/pagination_summary", :locals => {:search_data => search_data} %>
  <ul class="results-list">
    <% search_data['results'].each do |result| %>
      <%
         id = JSONModel(result["primary_type"]).id_for(result['uri'])
         repo_id = JSONModel(:repository).id_for(JSONModel.repository_for(result['uri']),{}, true)
      %>
      <li class="result">
        <h3>
          <%= icon_for result["primary_type"] %>
          <% if result["primary_type"] === "subject" %>
            <%= link_to result["title"], {"filter_term" => search_data.facet_query_string("subjects", result["title"])} %>
          <% elsif ["agent_person", "agent_software", "agent_family", "agent_corporate_entity"].include?(result["primary_type"]) %>
            <%= link_to result['title'], :controller => :records, :action => :agent, :id => id, :agent_type => result["primary_type"] %>
          <% elsif result["primary_type"] === "repository" %>
            <%= link_to result['title'], :controller => :search, :action => :repository, :repo_id => id %>
          <% else %>
            <%= link_to title_or_finding_aid_filing_title( result )  , :controller => :records, :action => result["primary_type"], :id => id, :repo_id => repo_id %>
          <% end %>
        </h3>
        <div class="result-summary">
          <%= render_aspace_partial :partial => "search/result_summary_#{result["primary_type"]}", :locals => {:obj => result} %>
        </div>
      </li>
    <% end %>
  </ul>
  <%= render_aspace_partial :partial => "search/pagination", :locals => {:search_data => search_data} %>
<% else %>
  <p class="alert alert-info">
    <%= I18n.t("search_results.no_results") %></em>.
  </p>
<% end %>
</div>

search_controller.rb

require 'advanced_query_builder'

class SearchController < ApplicationController

  DETAIL_TYPES = ['accession', 'resource', 'archival_object', 'digital_object',
                  'digital_object_component', 'classification',
                  'agent_person', 'agent_family', 'agent_software', 'agent_corporate_entity']

  VIEWABLE_TYPES = ['agent', 'repository', 'subject'] + DETAIL_TYPES

  FACETS = ["repository", "primary_type", "subjects", "source", "linked_agent_roles"]


  def search
    set_search_criteria

    @search_data = Search.all(@criteria, @repositories)
    @term_map = params[:term_map] ? ASUtils.json_parse(params[:term_map]) : {}

    respond_to do |format|
      format.html { render "search/results" }
      format.js { render_aspace_partial :partial => "search/inline_results", :content_type => "text/html", :locals => {:search_data => @search_data} }
    end
  end

  def advanced_search
    set_advanced_search_criteria

    @search_data = Search.all(@criteria, @repositories)

    render "search/results"
  end

  def repository
    set_search_criteria

    if params[:repo_id].blank?
      @search_data = Search.all(@criteria.merge({"facet[]" => [], "type[]" => ["repository"]}), {})

      return render "search/results"
    end

    @repository = @repositories.select{|repo| JSONModel(:repository).id_for(repo.uri).to_s === params[:repo_id]}.first

    @breadcrumbs = [
      [@repository['repo_code'], url_for(:controller => :search, :action => :repository, :id => @repository.id), "repository"]
    ]

    @search_data = Search.repo(@repository.id, @criteria, @repositories)

    render "search/results"
  end


  private

  def set_search_criteria
    @criteria = params.select{|k,v|
      ["page", "q", "type", "sort",
       "filter_term", "root_record", "format"].include?(k) and not v.blank?
    }

    @criteria["page"] ||= 1
    @criteria["sort"] = "title_sort asc" unless @criteria["sort"] or @criteria["q"] or params["advanced"].present?

    if @criteria["filter_term"]
      @criteria["filter_term[]"] = Array(@criteria["filter_term"]).reject{|v| v.blank?}
      @criteria.delete("filter_term")
    end

    if params[:type].blank?
      @criteria['type[]'] = DETAIL_TYPES
    else
      @criteria['type[]'] = Array(params[:type]).keep_if {|t| VIEWABLE_TYPES.include?(t)}
      @criteria.delete("type")
    end

    @criteria['exclude[]'] = params[:exclude] if not params[:exclude].blank?
    @criteria['facet[]'] = FACETS
  end


  def set_advanced_search_criteria
    set_search_criteria

    terms = (0..2).collect{|i|
      term = search_term(i)

      if term and term["op"] === "NOT"
        term["op"] = "AND"
        term["negated"] = true
      end

      term
    }.compact

    if not terms.empty?
      @criteria["aq"] = AdvancedQueryBuilder.new(terms, :public).build_query.to_json
      @criteria['facet[]'] = FACETS
    end
  end

  def search_term(i)
    if not params["v#{i}"].blank?
      { "field" => params["f#{i}"], "value" => params["v#{i}"], "op" => params["op#{i}"], "type" => "text" }
    end
  end

end

application_helper.rb

module ApplicationHelper

  def include_theme_css
    css = ""
    css += stylesheet_link_tag("themes/#{ArchivesSpacePublic::Application.config.public_theme}/bootstrap", :media => "all")
    css += stylesheet_link_tag("themes/#{ArchivesSpacePublic::Application.config.public_theme}/application", :media => "all")
    css.html_safe
  end

  def set_title(title)
    @title = title
  end

  def title_or_finding_aid_filing_title(resource)
    if resource["finding_aid_filing_title"] && !resource["finding_aid_filing_title"].nil? && resource["finding_aid_filing_title"].length > 0
      title = resource["finding_aid_filing_title"]
    elsif resource["title"] && !resource["title"].nil?
      title = resource["title"]
    else
      title = resource["display_string"]
    end
    MixedContentParser::parse(title, url_for(:root))


  end

  def icon_for(type)
    "<span class='icon-#{type}' title='#{I18n.t("#{type}._singular")}'></span>".html_safe
  end

  def label_and_value(label, value)
    return if value.blank?

    label = content_tag(:dt, label)
    value = content_tag(:dd, value)

    label + value
  end

  def i18n_enum(jsonmodel_type, property, value)
    return if value.blank?

    property_defn = JSONModel(jsonmodel_type).schema["properties"][property]

    return if property_defn.nil?

    if property_defn.has_key? "dynamic_enum"
      enum_key = property_defn["dynamic_enum"]
      #return "enumerations.#{enum_key}.#{value}"
      I18n.t("enumerations.#{enum_key}.#{value}", :default => value)
    else
      I18n.t("#{jsonmodel_type}.#{property}_#{value}", :default => value) 
    end
  end

  def params_for_search(opts = {})
    search_params = {
      :controller => :search,
      :action => :search
    }

    search_params["filter_term"] = Array(opts["filter_term"] || params["filter_term"]).clone
    search_params["filter_term"].concat(Array(opts["add_filter_term"])) if opts["add_filter_term"]
    search_params["filter_term"] = search_params["filter_term"].reject{|f| Array(opts["remove_filter_term"]).include?(f)} if opts["remove_filter_term"]

    search_params["sort"] = opts["sort"] || params["sort"]

    search_params["q"] = opts["q"] || params["q"]

    search_params["format"] = params["format"]
    search_params["root_record"] = params["root_record"]
    search_params["agent_type"] = params["agent_type"]

    search_params["page"] = opts["page"] || params["page"] || 1

    if opts["type"] && opts["type"].kind_of?(Array)
      search_params["type"] = opts["type"]
    else
      search_params["type"] = opts["type"] || params["type"]
    end

    search_params["term_map"] = params["term_map"]

    # retain any advanced search params
    advanced = (opts["advanced"] || params["advanced"])
    search_params["advanced"] = advanced.blank? || advanced === 'false' ? false : true
    search_params[:action] = :advanced_search if search_params["advanced"]

    (0..2).each do |i|
      search_params["v#{i}"] = params["v#{i}"]
      search_params["f#{i}"] = params["f#{i}"]
      search_params["op#{i}"] = params["op#{i}"]
    end

    search_params.reject{|k,v| k.blank? or v.blank?}
  end

  def set_title_for_search
    title =  I18n.t("actions.search")

    if @search_data
      if params[:type] && !@search_data.types.blank?
        title = "#{I18n.t("search_results.searching")} #{@search_data.types.join(", ")}"
      end

      facets_to_display = []

      if @search_data.query?
        facets_to_display << @search_data.facet_label_for_query
      end

      if @search_data.filtered_terms?
        facets_to_display << @search_data[:criteria]["filter_term[]"].collect{|filter_term| @search_data.facet_label_for_filter(filter_term)}
      end

      if facets_to_display.length > 0
        title += " | #{facets_to_display.join(", ")}"
      end
    end

    set_title(title)
  end

  def truncate(string, length = 50, trailing = '&hellip;')
    return string if string.length < length

    "#{string[0..50]}#{trailing}".html_safe
  end


  # See: ApplicationController#render_aspace_partial
  def render_aspace_partial(args)
    defaults = {:formats => [:html], :handlers => [:erb]}
    return render(defaults.merge(args))
  end

  def proxy_localhost?
    AppConfig[:frontend_proxy_url] =~ /localhost/
  end

end

2 个答案:

答案 0 :(得分:1)

错误发生在_inline_results.html.erb ...

<% elsif result["primary_type"] === "repository" %>
        <%= link_to result['title'], :controller => :search, :action => :repository, :repo_id => id %>

错误是结果['title']为零。所以,添加这行代码......

<% elsif result["primary_type"] === "repository" %>
  <% if !result['title'].blank? %>        
    <%= link_to result['title'], :controller => :search, :action => :repository, :repo_id => id %>
  <% end %>

答案 1 :(得分:0)

我明白了。看起来导入的一些数据有空白标题“”。通过更新它们就可以工作了。