我正在构建一个用户提交帖子的应用程序,然后用他们所在的年份,位置和军事单位标记它们。在我的索引页面上,我想要有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
答案 0 :(得分:1)
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