使视图,控制器和模型可访问方法

时间:2011-09-15 00:45:03

标签: ruby-on-rails ruby-on-rails-3 json

我在Rails 3.0上。对于模型的updated_at列,我需要将其输出为JSON中的用户友好格式,因此我不想将此2011-09-14T22:01:32Z视为值,而是希望显示less than a minute ago(或其他我决定用户友好的消息updated_at。我编写了一个方法,以用户友好的格式返回输出,现在需要在视图,控制器和模型中提供功能。这样做的最佳方式是什么,所以这不是错综复杂或不好的做法。

编辑来自@klochner的回答,这是我date.rb的样子,但现在它抛出date.rb:21:in格式':错误的参数数量(2为0)(ArgumentError )`

include ActionView::Helpers::DateHelper

class ActiveSupport::TimeWithZone
  def friendly
    format
  end
end

class Date
  def friendly
    format
  end
end

class Time
  def friendly
    format
  end
end

def format
  if self.today?
    format_time = ...
  elsif (self < Time.now.beginning_of_day) and (self > Time.now.yesterday.beginning_of_day)
    format_time = ...
  else
    format_time = ...
  end
end

@klochner建议将format更改为format_helper效果很好。谢谢!

1 个答案:

答案 0 :(得分:2)

MonkeyPatch ActiveSupport::TimeWithZone类,这就是我所做的(我把它放在config/initializers/date.rb中)

class ActiveSupport::TimeWithZone
  def mdy
    self.strftime("%m/%d/%Y")
  end
end
class Date
  def mdy
    self.strftime("%m/%d/%Y")
  end
end
class Time
  def mdy
    self.strftime("%m/%d/%Y")
  end
end

然后,对于任何日期对象(或AR模型中的日期字段),您可以调用mdy()

 > Time.now.mdy
 => "09/14/2011" 
> User.first.created_at.mdy
 => "02/27/2009" 
> Date.today.mdy
 => "09/14/2011" 

对于json,您可能希望为要渲染的模型编写as_json方法。看到这个相关的答案: render :json does not accept options