rails从下拉传递值

时间:2013-08-09 13:26:59

标签: ruby-on-rails

实现以下目标的最有效方法是:从下拉列表中获取值并使用搜索功能将其传递到模型中。

以下是搜索的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中设置我的下拉列表并将其一直传递给控制器​​?实现这个目标的最佳方法是什么?

编辑:忘了提一下,下拉列表应该显示卡车号码之类的东西,但是传入值卡车号码

1 个答案:

答案 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以查看已翻译的属性
  • 添加一个类方法,该方法只返回您想要“搜索”的列
  • 使用ActiveRecord的方法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]) %>