0

我的模型中有一个字段:birth_time,我正在尝试从 3 个表单字段构建它,但我的时间很长。我尝试了两种不同的方法。这是我在第一种方法中的表单片段:

    <input type="text" class="span1" name="birth_time_hour" id="birth_time_hour" placeholder="hour">
    <input type="text" class="span1" name="birth_time_minute" id="birth_time_minute" placeholder="minute">
    <select name="birth_time_meridiem" id="birth_time_meridiem" class="span1">
      <option value="am">AM</option>
      <option value="pm">PM</option>
    </select>

我的模型:

attr_accessible :birth_time

我想要在我的控制器中做的是获取这三个表单值,创建一个 Time 对象,并在保存之前将其设置为 Pick.birth_time。我在对参数 [“birth_time_hour”] 进行任何算术运算时遇到问题。如果是 PM,我想在创建 Time 对象之前添加 12。

params["birth_time_hour"] + 12导致can't convert Fixnum into String params["birth_time_hour"].to_i结果exception class/object expected

我需要先从表单值创建一个对象吗?

我的第二种方法是将 attr_accessible 值添加到模型中,即使它们实际上并未存储在数据库中。

attr_accessible :birth_time_hour, :birth_time_minute, :birth_time_meridien, :birth_time

然后在我的表单中(使用 simple_form):

<%= f.input :birth_time, :label => "Birth time:", :as => :tel, :input_html => { :class => 'span2' }, :placeholder => 'hour' %>

但这只是在尝试渲染表单时爆炸:

undefined method `birth_time_hour' for #<Pick:0x0000010657c248>

我不太确定为什么我不能有一个 attr_accessible 。我之前将它与密码字段一起使用,它只存在于表单上,而不存在于数据库中。

编辑:当我将 attr_accessible 和 attr_accessor 用于birth_time_hour 时,它似乎效果更好。它至少可以构建表单,但我仍然不认为它是控制器中 Pick 对象的一部分。我对 attr_accessor 及其用途知之甚少,我很确定。

关于如何解决看似简单的问题的任何想法?我已经阅读了其他建议将所有 3 个值存储在数据库中的 SO 线程,这似乎很愚蠢,因为我都知道了。我真的希望不是这样。

4

2 回答 2

0

为什么不使用 time_select?它会自动为您完成这一切。 http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_select

attr_accessible :birth_time 

是您模型中所需要的一切。

在您的表格中使用

 <%= f.time_select :birth_time %>

time_select 有几个选项。请参阅手册。


你可以composed_of 在 Rails 中使用composed_of——什么时候使用?


如果这还不够好,那么......我想你可以创建自己的 setter 方法。(回答你的问题)

def birth_time=(birth_time)
  # create the time object from birth_time

end

以你的形式

= text_field_tag "model_name[birth_time][hr]"
= text_field_tag "model_name[birth_time][min]"
= text_field_tag "model_name[birth_time][sec]"

f.fields_for :birth_time如果您更喜欢生成名称的方法,也可以使用)

= form_for @model do |f|
    = f.fields_for :birth_time do |btf|
        - [:hr, :min, :sec].each do |n|
            = btf.text_field n

现在,在您的 setter 方法中,您将获得如下所示的哈希:

{ 'hr' => '12', 'min' => '16', 'sec' => '26' }

有了它,您可以从哈希构造您的值并将其设置为:

self[:birth_time] = 

我希望这会有所帮助。可能还有其他方法可以做到这一点,但我认为这是最简单的。

于 2012-07-10T23:54:54.907 回答
0

您似乎对 attr_accessible 的含义感到困惑。

attr_accessible 意味着您可以像这样对属性进行大规模分配model.update_attributes({:birth_time_hour => '1'})

但是您显然不需要这个,因为您的模型中没有字段birth_time_hour。

至于 attr_accessor 的作用,它以这种方式为你的类定义了一个 reader 和 writer

attr_accessor :my_var

#is the same as

def my_var
  @my_var
end

def my_var=(value)
  @my_var = value
end

至于您的问题,您应该在模型中执行以下操作:

def birth_time_minute
  self.birth_time.min
end

def birth_time_hour
  self.birth_time.hour
end

假设birth_time 是一个时间对象(这是有道理的)

于 2012-07-11T01:32:10.800 回答