将局部变量传递给Rails 4中用于Ransack关联的部分层次结构

我正在尝试使用Ransack在我的所有模型的索引页面上实现搜索和排序表单。 我想尽可能干这样做,所以我在views / application文件夹中创建了三个部分:

  • 视图/应用/ _table_search_and_sort_form.html.erb
  • 视图/应用/ _condition_fields.html.erb
  • 视图/应用/ _sort_fields.html.erb

每个代码如下:

视图/应用/ _table_search_and_sort_form.html.erb

视图/应用/ _condition_fields.html.erb

 <div class="field" data-object-name="">         

视图/应用/ _sort_fields.html.erb

 <div class="field" data-object-name="">   

在我的每个控制器中,我都有类似的东西:

 def index @search = Document.search(params[:q]) @documents = @search.result.paginate(:page => params[:page]) @search.build_condition if @search.conditions.empty? @search.build_sort if @search.sorts.empty? end 

然后我通过添加以下内容将表单添加到每个index.html.erb:

  

其中:associations数组对于每个模型是不同的,这取决于我希望可以从条件表单访问的关联。 当我不尝试通过两个部分向下传递:associations数组时,只需将数组硬编码到_condition_fields.html.erb中,例如:

  

一切正常(对于那个模型,在这种情况下为Document)。 当我尝试通过将:associations数组从索引传递到_table_search_and_sort_form并将其传递到_conditional_form来将其扩展到多个模型时,我收到以下错误:

 undefined local variable or method `associations' Extracted source (around line #3): 1 <div class="field" data-object-name=""> 2  3  4  5  6  

为什么关联数组不会传递到第一个部分之外,即使它给渲染的本地哈希? 我认为Rails并不关心你从一个部分调用了多少部分? 我试图重命名关联以避免与* attribute_select *的关联参数混淆,但这没有区别。

问题是我有一个应用程序助手定义为

  def link_to_add_fields(name, f, type) new_object = f.object.send "build_#{type}" id = "new_#{type}" fields = f.send("#{type}_fields", new_object, child_index: id) do |builder| render(type.to_s + "_fields", f: builder) end link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")}) end 

这个帮助器在_table_search_and_sort_form中调用,你可以看到’associations’数组没有被传递给它,所以这就是抛出错误的地方,而不是我最初怀疑的第4行。 我想我可以破解这个方法来传递可选数组,但我宁愿不这样做; 它适用于_condition_fields和_sort_fields部分,我认为如果我破解或超载它,我会为自己制造麻烦。 相反,我将寻找另一种方法来添加一些关联到搜索表单,可能是通过覆盖模型中的self.ransackable_attributes或self.ransackable_associations。 我没有找到关于此的更多可靠文档,但我会进行一些实验。 希望这也有助于其他人。

可能不是一个答案,但在评论中似乎很长

虽然我可能错了,但我不确定你能否一起使用localsobject 。 也许试试吧

 <%= render "table_search_and_sort_form", locals: { search: @search, associations: [:status, :job, :project, :language, :data_files] } %> 

然后修改部分

 
<%= search_form_for search do |f| %> <%= f.condition_fields do |c| %> <%= render partial: "condition_fields", locals: { f: c, associations: associations } %> <% end %>

<%= link_to_add_fields "Add Conditions", f, :condition %>

<%= f.sort_fields do |s| %> <%= render "sort_fields", f: s %> <% end %>

<%= link_to_add_fields "Add Sort", f, :sort %>

<%= f.submit "Search" %>
<% end %>
Interesting Posts