如何在Rails中使用多个参数进行过滤?

时间:2015-07-07 14:34:26

标签: ruby-on-rails ruby model-view-controller

我正在构建一个用户提交帖子的应用程序,然后用他们所在的年份,位置和军事单位标记它们。在我的索引页面上,我想要有3个年度位置和军事单位的下拉菜单,当用户在下拉列表中指定不同的值时,索引仅筛选具有这些参数的帖子。但是,我一遍又一遍地失败了。

这是我的帖子控制器:

    def index
    @posts = Post.all
    @posts = @posts.location(params[:location]) if params[:location].present?
    @posts = @posts.unit(params[:unit]) if params[:unit].present?
    @posts = @posts.year(params[:year]) if params[:year].present?
    end

我的索引视图:

    <h1>All Posts</h1>
    <%= form_tag 'search', method: 'get' do %>
    <%= select :location, options_for_select(countries) %>
    <%= select :year, Time.now.year.downto(1900).to_a %>
    <%= select :unit, options_for_select(["army", "navy"]) %>
    <%= submit_tag "filter" %>
    <% end %>

</p>
<ul id="posts">
<% @posts.each do |post| %>
<li>
<%= link_to post.id, post_path(post) %>
</li>
<% end %>
<%= link_to "New Post", new_post_path %>
</ul>

我的帖子模型:

    class Post < ActiveRecord::Base
    belongs_to :user
    has_many :comments
    has_attached_file :image
    validates_attachment_content_type :image, :content_type =>     ["image/jpg","image/jpeg","image/png"]
end

就像它现在一样,我收到的错误是“Posts #index中的NoMethodError”:“未定义的方法`空?”为零:NilClass“。突出显示的行来自视图:

<%= select :location_id, options_for_select(countries) %>

感谢您对此提供任何帮助。我已经搜索过,而且找不到很多有帮助的东西。

编辑:国家来自以下帮助者:

    module CountriesHelper


    def countries
    [
     "Afghanistan",
     "Aland Islands",
     "Albania",
     "Algeria",

#truncated for space

      "Western Sahara",
      "Yemen",
      "Zambia",
      "Zimbabwe"
    ]

    end
    end

2 个答案:

答案 0 :(得分:1)

select数组需要格式化为:

def countries
    [
     ["Afghanistan","Afghanistan"],
     ["Aland Islands","Aland Islands"],
     ["Albania","Albania"],
     and so on
.
.
.
    ]

然后根据您的示例代码段使用搜索中的选择选项:

<%= select_tag :search, options_for_select(countries), prompt: "Choose a country", class: 'your_css_class_here' %>

可能还有其他一些问题,但这会正确设置辅助数组。让我知道会发生什么,我可以添加到我的答案中。

答案 1 :(得分:-1)

country变量来自哪里?这是一个零,这意味着它没有设置。

我不是一个超级红宝石编码器,但这也向后看我。

def index
@posts = Post.all
@posts = @posts.location(params[:location]) if params[:location].present?
@posts = @posts.unit(params[:unit]) if params[:unit].present?
@posts = @posts.year(params[:year]) if params[:year].present?
end

我认为这更像是

def index
@posts = Post.all
   if params[:location].present?
       @posts = @posts.location(params[:location]) 
   end
   if params[:unit].present?
      @posts = @posts.unit(params[:unit]) 
   end
   if params[:year].present?
      @posts = @posts.year(params[:year])
   end
end