【问题标题】:Search potentially multiple params搜索可能的多个参数
【发布时间】:2015-11-13 12:48:36
【问题描述】:

我想通过可能的 2 个参数进行搜索,但也不需要两者都存在。现在,如果未选择任何内容,则 state_id 传递为“”,我不知道如何摆脱它。

查看:

<div dropdown-toggle>
 <%= form_tag('/municipalities', method: :get) do %>
 <%= select_tag(options_for_select(@dropdown), {:allow_blank => "Please select"}, class: "btn btn-default btn-lg dropdown-toggle")  %>
  <%= submit_tag "Search", class: "btn btn-default"
 %>
  <%= link_to "Reset", municipalities_path, class: "btn btn-default" %>
  <%= button_tag 'Counties Only', name: "municipality_type", value: "County", class: "btn btn-default pull-right" %>
 <% end %>
</div>

控制器(我还是新人,所以这还不够干净)

 def index

  @dropdown = State.all.map{ |s| [s.state, s.id]}
  @municipality = Municipality.order(:name)
  @count = @municipality.count

  if !params[:state_id].to_s.blank? && params[:municipality_type].present?
        @municipalities = Municipality.where(municipality_type: params[:municipality_type], state_id: params[:state_id])
        @forms = Form.where(municipality_id: @municipalities, state_id: @state)
        if !params[:state_id].blank?
          @present = params[:state_id] 
          @state = params[:state_id]
          @state_name = State.find(@state)
        end
        @count_state = @municipalities.count
  elsif params[:state_id].present?
    @present = params[:state_id] 
    @state = params[:state_id]
    @state_name = State.find(@state)
    @municipalities = Municipality.where(state_id: @state)
    @forms = Form.where(municipality_id: @municipalities)
    @count_state = @municipalities.count
  else
    @forms = nil
    @state = State.all
    @municipalities = Municipality.order(:name)
  end
end

【问题讨论】:

  • 您要搜索哪种型号?

标签: ruby-on-rails forms search


【解决方案1】:

如果我正确理解您的问题,您可以分别将您的条件简单地设置为if params[:state_id] &amp;&amp; params[:municipality_type]elsif params[:state_id],如果在表单中提交,它们将通过条件。

【讨论】:

  • 我的问题是,如果没有选择任何状态,它仍然会传递一个 param[:state_id] = "" 我需要它什么都不传递,或者 nil,如果没有选择一个状态,所以它只搜索县。
  • 对不起,我完全误解了。我认为你应该按照 Ben 在下面的建议去做,因为如果你想在下拉列表中有一个空白选项并且它被选中,它总是会传递一个空字符串。
  • 另一种选择可能是从表单中删除 button_tag 并使其成为 button_to 然后它不应该从表单中提交其余参数,即 state_id
【解决方案2】:

我会试一试,我可能没有正确理解您的意图。您似乎定义了很多不需要的变量。

我相信这就是让两个参数搜索城市所需的全部内容,但允许它们为空白:

def index
  @municipailies = Municipality.order(:name)
  state_id = params[:state_id]
  type = params[:municipality_type]
  @municipalities = Municipality.where(state_id: state_id) if state_id
  @municipalities = Municipality.where(municipality_type: type) if type
end

【讨论】:

  • 感谢您的意见!问题不在控制器中(我不认为),而在视图中。我的问题是,如果没有选择任何州,它仍然会传递一个 param[:state_id] = "" 我需要它什么都不传递,或者 nil,如果没有选择一个州,所以它只搜索县。跨度>
  • 好,那就把if语句改成if state_id.present?
  • 是的,我认为我的解释不正确。如果 state_id.present?它评估为真,因为 state_id 被传递为“”。即使它不是一个数字,它仍在评估为现值。
  • "".present? 应该评估为假。是否有可能您实际上是从其他地方获取 param[:state_id] 而不是您查看上面的代码?您实际上并没有根据您在上面发布的内容在选择标签中设置 state_id - 它应该更像&lt;%= select_tag("state_id", options_for_select(@dropdown), {:include_blank =&gt; true, class: "btn btn-default btn-lg dropdown-toggle"}) %&gt;。请注意,我还将类更改为选项括号内。我还没有测试过这个顺便说一句...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2012-08-29
相关资源
最近更新 更多