【问题标题】:Making a method accessible to views, controller and model使视图、控制器和模型可以访问方法
【发布时间】:2011-11-17 11:44:10
【问题描述】:

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

编辑根据@klochner 的回答,这是我的date.rb 的样子,但现在它抛出date.rb:21:informat':参数数量错误(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 效果很好。谢谢!

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 好东西,我已经掌握了基础知识,现在的问题是如何将其包含在 JSON 中,我可以创建自定义方法并在 JSON 调用中使用 :methods 包含它们,但我更喜欢如果可能的话,更优雅的东西。抱歉,由于我没有足够的声望点,所以我还不能投票给你的答案,如果你投票给我的问题,它可能会帮助我投票给你的答案:)
    • 我不明白为什么你不能在 JSON 中包含这个 - 只需使用实例方法,它应该无处不在。
    • JSON 调用的语法是什么?另外,我遇​​到了一个新问题,rails console 现在抛出了wrong number of arguments (2 for 0) error in 'format' for date.rb'。我已经用format 方法的详细信息更新了我的问题。
    • 您可以通过将 format 重命名为 format_helper 来修复参数错误
    • 对不起@klochner,我仍然没有足够的分数来投票给你的答案,但我现在可以将其标记为答案。是的,我刚得到 15 分,并且对你的答案投了赞成票。
    猜你喜欢
    • 2012-08-23
    • 2011-06-26
    • 2011-10-22
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多