实现以下目标的最有效方法是:从下拉列表中获取值并使用搜索功能将其传递到模型中。
以下是搜索的html:
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
以下是控制器中的代码:
def index
@trucks = Truck.search(params[:search])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @trucks }
end
端
这是模型
def self.search(search)
if search
where('truck_no LIKE ?', "%#{search}%")
else
scoped
端
在模型中我有'truck_no LIKE ?'
我希望它成为column_name + ' LIKE ?'
,我通过method参数传递列名。如何在html中设置我的下拉列表并将其一直传递给控制器?实现这个目标的最佳方法是什么?
编辑:忘了提一下,下拉列表应该显示卡车号码之类的东西,但是传入值卡车号码
答案 0 :(得分:5)
以下是基础:
# view
<p>
<%= text_field_tag :search, params[:search] %>
<%= select_tag :search_column, options_for_select(Truck.column_names, params[:search_column]) %>
<%= submit_tag "Search", :name => nil %>
</p>
# controller
def index
@trucks = Truck.search(params[:search], params[:search_column])
# model
def self.search(keyword, column_name)
if self.column_names.include?(column_name.to_s)
where("trucks.#{column_name} LIKE ?", "%#{keyword}%")
else
scoped
end
end
您可以在此处执行几项改进:
select_field_tag
以查看已翻译的属性sanitize
确保column_name
安全如果您需要,我可以帮助您改进。
在这里我们有一个选择,我们应该获得所有列并取消其中的一些吗?或者我们应该选择我们想要的那个?第一个选项意味着如果向模型添加属性,默认情况下会将其添加到选项中,除非您将其取消。第二种选择会发生相反的情况:
# model
# This method should return the columns defined in the `wanted_columns` array
def self.searchable_columns
wanted_columns = ['name', 'description', 'etc' ]
self.column_names.select{ |column| wanted_column.include?(column) }
end
# This method will return the columns NOT IN the `unwanted_columns` array
def self.searchable_columns
unwanted_column = ['id', 'created_at', 'updated_at']
self.column_names.reject{ |column| unwanted_column.include?(column) }
end
# view
<%= select_tag :search_column, options_for_select(Truck.searchable_columns, params[:search_column]) %>
# model
# This method return an array of arrays formatted like following:
# [ ['Name', 'name'], ['Truck Number', 'truck_no'] ]
def self.translated_searchable_columns
columns = self.searchable_columns
result = columns.map{ |column| [Truck.human_attribute_name(column.to_sym), column] }
result
end
# view
<%= select_tag :search_column, options_for_select(Truck.translated_searchable_columns, params[:search_column]) %>