2013-05-14 71 views
0

我试图从几个text_fields中存储一些字符串到数组中,然后将其保存到数据库中。 我有一个名为“OPENING_HOURS”至极我试着分成使用虚拟属性,这样2个不同的属性栏:将几个text_field字符串存储到数组Rails 3

型号

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}

用“|”分隔一周的不同日子。

我已经试过几件事情像控制器:

控制器

class VenuesController < ApplicationController 
    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]} 
    if @venue.save 
     redirect_to venue_path(@venue), :notice => "Success!" 
    else 
     render 'new' 
    end 
end 

但似乎没有任何工作......无论它只是START_TIME和END_TIME从保存的最后一天,或没有任何东西可以保存。

回答

0

也许我可能误解了,但是......

在你创建的行动,也没有@ venue.save - 这可能是为什么你没有看到任何东西保存。

类VenuesController < ApplicationController的

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 

+0

我在代码中有@ venue.save,只是忘了在文章中输入它。我马上编辑它。 – Jesper 2013-05-14 12:53:11

0

您的解决方案是行不通的,因为你把三个文本字段每个指向同一个领域。 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会和输入的值组成一个散列。请注意,您必须明确定义一个值,否则这不起作用。

然后,在控制器,你必须添加一些代码

  • 编辑时,转换阵列字符串值的形式
  • 保存时,该recevied哈希转换为字符串你可以保存。

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