存储几个text_field字符串到数组Rails 3



我试图从一对夫妇的text_fields,我有一个数组存储一些字符串,然后将其保存到DB。我有一个名为"opening_hours"的专栏;我试着用虚拟属性把它分成两个不同的属性,像这样:

<标题>
class Venue < ActiveRecord::Base
    attr_accessible :opening_hours, :start_time, :end_time
    attr_writer :start_time, :end_time
    def start_time
        @start_time.nil? ? @start_time : opening_hours.to_s.split("-").first  
    end
    def end_time
        @end_time.nil? ? @end_time : opening_hours.to_s.split("-").last
    end
end

这个想法是你输入一个start_time和一个end_time,像这样:

<标题> 视图
<%= form_for @venue do |v| %>
    <p><%= v.label "Monday" %><%= v.text_field :start_time %>-<%= v.text_field :end_time %><p/>
    <p><%= v.label "Tuesday" %><%= v.text_field :start_time %>-<%= v.text_field :end_time %><p/>
    <p><%= v.label "Wednesday" %><%= v.text_field :start_time %>-<%= v.text_field :end_time %><p/>
<% end %>

数组在DB中应该是这样的:

{08-12 | 09-14 | 07-13}

带"|"分隔一周中的不同天。

我在控制器中尝试了一些东西,如:

<标题>控制器h1> 是似乎什么都不起作用……它要么只保存最后一天的start_time和end_time,要么什么都不保存。

我可能误解了,但是…

在创建操作中,没有@venue。保存-这可能就是为什么你没有看到任何保存的原因。

类VenuesController <程序控制器>

def new
    @venue = Venue.new
end
def create
    @venue = Venue.new(params[:venue])
    @total_time = params[:venue][:start_time]+"-"+params[:venue][:end_time]
    @venue.opening_hours = @total_time.map {|t| [t.start_time, t.end_time]}
    @venue.save
end
结束

您的解决方案将不起作用,因为您放置了三个文本字段,每个字段都指向同一个字段。Rails将只取最后一个值。

Rails将使用输入字段的名称来构造您在服务器上接收到的参数散列。由于字段具有相同的名称,因此只保留一个值。

解决方案非常简单:使用相同的rails标准,我们可以更改输入字段的名称,以便rails将其作为散列处理。

<p>
  <%= v.label "Monday" %>
  <%= text_field :venue, 'start_time[][monday]', :value => '07' %>
  <%= text_field :venue, 'end_time[][monday]', :value => '21' %>
<p/>
<p>
  <%= v.label "Tuesday" %>
  <%= text_field :venue, 'start_time[][tuesday]', :value => '07' %>
  <%= text_field :venue, 'end_time[][tuesday]', :value => '09' %>
<p/>

由于end_timestart_time不是一个数组,我必须稍微伪造一下,所以我使用手动text_field,使用作为对象名称venue,因此它将与您的场地的其他参数分组。然后构建名称,因此rails将用输入的值组成一个散列。注意,您必须显式地定义一个值,否则将不起作用。

然后,在控制器中,您必须向

添加一些代码
  • 编辑时,将数组字符串转换为表单
  • 中的值
  • 保存时,将接收到的散列转换为可以保存的字符串。

注意:如果您不这样做,它将保存序列化的散列,这可能已经足够了。

相关内容

  • 没有找到相关文章

最新更新