保留搜索表单数据Ruby On Rails

时间:2011-03-08 21:45:46

标签: ruby-on-rails ruby formtastic

尝试使用simple_form在我的主页上构建搜索(与formtastic非常相似)。搜索工作正常,我得到了我的结果,但提交后我想保留用户提交的内容。

我正在为表单使用命名空间,因此如何保留表单的数据。以下是一些可能有用的代码。

控制器

def index
  @results = Property.search(params[:search])
end

查看

%h1 Search Form
= simple_form_for(:search) do |f|
    = f.input :location, :as => :select, :collection => Location.all.asc(:name)
        = f.input :type, :collection => PropertyType.all.asc(:name)
        = f.input :bedrooms, :collection => 1..10,
    %p.box
        = f.button :submit

-if @results
    %h1 Search Results
    .results
        - @results.each do |property|
            .result
                %h1= property.title

在Index控制器中,我尝试了各种各样的东西,即

@search = params[:search]

但是每当我尝试搜索时,搜索都会中断。

我做错了什么?

希望你能提出建议

3 个答案:

答案 0 :(得分:2)

一种方法是按照Xavier Holt建议的方式进行,并将值传递给每个输入。 simpleform doco建议:

 = f.input :remember_me, :input_html => { :value => '1' }

另一种方法是让simpleform为你做。如果你给它一个类似于activerecord对象的东西,SimpleForm会自动用字段填充字段。

在这种情况下,这意味着要创建一个模型对象:

class PropertySearchCriteria
  attr_accessor :location, :type, :bedrooms
  def initialize(options)
    self.location = options[:location]
    self.type = options[:bedrooms]
    self.bedrooms = options[:bedrooms]
  end
end

然后,更改您的控制器:

def index
  @property_search_criteria = PropertySearchCriteria.new(params[:search])
  @results = Property.search(@property_search_criteria)
end

(您还必须更改Property.search方法)

然后,更改simple_form_for:

= simple_form_for(:search, @property_search_criteria) do |f|

如果你做了所有这些,并让星星恰到好处地对齐,那么simpleform将预先填充表单字段。您可能需要向PropertySearchCriteria添加一些内容才能使simpleform感到满意。

这只是为了让价值显示出来,但是如果您需要添加验证,它会让您保持理智。

答案 1 :(得分:0)

您可以尝试在会话中存储您的参数,如下所示:

def index
  @results = Property.search(params[:search])
  store_search
end

def store_search
  session[:search] = params[:search]
end

确定完成了清理它们的参数后

...
clear_search if session[:search]

def clear_search
  session[:search] = nil
end

答案 2 :(得分:0)

我在我正在处理的应用程序中做了类似的事情(我没有使用formtastic,但这应该至少非常接近适合你的东西)。我通过确保@search是控制器中的哈希来解决它:

@search = params[:search] || {}

然后在我的所有搜索输入中使用@search[:key]作为:value选项(您可能需要设置@search.default = ''才能使其正常工作):

<%= text_field_tag :name, :value => @search[:name] %>

这就是全部。随着我的应用程序变得越来越复杂和AJAXy,我一直在考虑将搜索参数移动到会话信息中,您现在可能希望这样做以保持领先,但如果您只是在寻找一个简单的解决方案,那么对我很好。

希望这有帮助!