rails:在表单中编辑序列化数据

时间:2011-02-05 23:11:28

标签: ruby-on-rails serialization activerecord

我有一个模型,其中有一个是序列化哈希的参数。我希望能够使用内置的rails功能在表单中编辑哈希。它几乎正在工作。如果填写表格并提交,则参数序列化正确,并且在控制器中,模型使用预期值构建。它崩溃的地方是我希望表单显示现有模型:表单字段中没有显示任何值。

我的模型看起来像:

class Search < ActiveRecord::Base
  serialize :params
end

形式:

<%= form_for @search do |f| %>
  <%= f.fields_for :params, @search.params do |p| %>
    <%= p.label :square_footage, "Square Footage:" %>
    <%= p.text_field :min_square_footage, :size => 10, :placeholder => "Min" %>
    <%= p.text_field :max_square_footage, :size => 10, :placeholder => "Max" %>
  <% end %>
  ...
<% end %>

在控制器的创建方法中:

@search = Search.new(params[:search])
@search.params ||= Hash.new
logger.info("search = #{@search.inspect}")

在日志中:

search = #<Search id: nil, params: {"min_square_footage"=>"1200", "max_square_footage"=>"1500"}, created_at: nil, updated_at: nil>

所以你可以看到值被POST。

在我看来,在表单上方,我添加了这一行,看看我是否至少可以访问这些值:

<%= @search[:params][:min_square_footage] %>

我可以。

因此,如果我可以访问视图中的值,并且表单成功地将数据发送到我的控制器,为什么我的表单不能显示数据呢?

2 个答案:

答案 0 :(得分:0)

这有效:

<%= p.text_field :min_square_footage, :size => 10, :placeholder => "Min", :value => @search[:params][:min_square_footage] %>
<%= p.text_field :max_square_footage, :size => 10, :placeholder => "Max", :value => @search[:params][:max_square_footage] %>

但并不理想。 rails应该自动连接表单值不应该吗?

答案 1 :(得分:0)

我认为您需要一个对象 - 方法关系,以便在表单中默认填充值。 Rails调用这些方法来填充表单。您可以在搜索模型中为两个数据min_square_footage和max_square_footage编写方法,如下所示

class Search < ActiveRecord::Base
  serialize :params

  def min_square_footage
    params[:min_square_footage] unless params.blank?
  end

  def max_square_footage
    params[:max_square_footage] unless params.blank?
  end
end

并在视图中:

<%= form_for @search do |f| %>
  <%= f.label :square_footage, "Square Footage:" %>
  <%= f.text_field :min_square_footage, :size => 10, :placeholder => "Min" %>
  <%= f.text_field :max_square_footage, :size => 10, :placeholder => "Max" %>
  ...
<% end %>