【问题标题】:Loop through array in Ruby/Rails在 Ruby/Rails 中循环遍历数组
【发布时间】:2013-10-12 13:09:44
【问题描述】:

由于我几乎是 Rails 的初学者,我想知道如何最好地循环遍历数组并修改一些值。数组被渲染到一个视图,jQuery 将在该视图中接收数据并显示它。我想在 Controller 中做艰苦的工作(或者我可能会在以后切换到模型)。

该数组称为@invoices,但数组中有一个我要格式化的时间戳。

要格式化的代码是:

Time.at(@invoice.date).strftime("%d/%m/%Y")

有人可以告诉我如何循环并覆盖时间戳值

【问题讨论】:

    标签: jquery ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    ruby 循环的一种可能语法是。-

    @invoices.each do |invoice|
        invoice.date = Time.at(invoice.date).strftime("%d/%m/%Y")
    end
    

    【讨论】:

    • 谢谢 - 实际上我曾经有过这个问题 - 它的 DO YOUR STUFF 位出了问题!
    • @invoices.date = Time.at(invoice.date).strftime("%d/%m/%Y")
    • @tommyd456 不是@invoice,只是invoice。块的变量由|invoice| 定义,没有为您设置@invoice
    • 就是这样 - 我太接近了!哈哈 - 我会在允许的时候打勾
    • 我说过我会在我之前的评论中打勾!哈哈
    【解决方案2】:

    其实你关心的是如何呈现数据。这不是控制器的逻辑。

    更好的方法是在模型中进行。假设你使用 JSON 向 jQuery 渲染数据,你只需要添加一个 present 方法并覆盖 as_json

    class Invoice < ActiveRecord::Base
      # Add a method to present the original date
      def formatted_date
        Time.at(self.date).strftime("%d/%m/%Y")
      end
    
      # Include above method in Controller's to_json and remove old :date
      def as_json(options)
        super(method: :formatted_date, except: :date)
      end
    end
    

    然后在控制器中你什么都不用做。

    【讨论】:

    • 是的,我提到我可能会在我的问题中将逻辑转换为模型,所以这很好 - 谢谢
    • 但是哪个位在哪里?我不太确定您在示例代码中的第二条评论
    • 我应该提到我正在使用的数据来自一个已经格式化为 json 的 API
    • Tommy,你的控制器将调用to_json,所以你需要做什么来操作模型级别的to_json输出,这需要在as_json上进行更改。这不是控制者的事。
    • 如果数据来自 API,它仍然是一个模型。如果你不使用模型来表示 API 结果,而是在控制器中处理它,那你就错了。
    【解决方案3】:

    我不清楚您是否只向 JQuery 发送日期。如果是这样,您可以在控制器中执行此操作:

    respond_to do |format|
       format.html { render :json => @invoices.collect {|invoice| invoice.date.strftime("%d/%m/%Y")} }
    end
    

    注意块中invoice 之前没有@,因为invoice 是当前正在处理的数组中单个元素的别名。

    如果要整张发票,只是稍微复杂一点,还有一堆Ruby小聪明可以尽量减少行数。

    【讨论】:

    • 我正在将 invoices 数组发送到 jQuery,然后我将在其中迭代结果 - 我只是认为最好在发送前将日期排序为所需的格式。
    【解决方案4】:

    如果您只想以特定格式显示数据,则不应更改数据。

    Rails 允许您更改 Date 在视图中呈现的格式(特定于每个区域设置):

    # config/locales/en.yml
    en:
      time:
        formats:
          my_format: "%d/%m/%Y"
    
    # in the view
    <%= l invoice.date, format: :my_format %>
    

    (见:http://guides.rubyonrails.org/i18n.html#adding-date-time-formats

    或者(如果您不需要语言环境支持)您将我们自己的格式添加到 to_formatted_s 方法中:

    # in config/initializers/date_formats.rb
    Date::DATE_FORMATS[:my_format] = "%d/%m/%Y"
    Time::DATE_FORMATS[:my_format] = "%d/%m/%Y"
    
    # in the view
    <%= invoice.date.to_s(:my_format) %>
    

    (见:http://api.rubyonrails.org/classes/Time.html#method-i-to_formatted_s

    【讨论】:

    • 但渲染数据的是 jQuery
    • 不清楚您如何发送数据。即使您直接通过render :json =&gt; @invoices 发送数据,最好使用全局定义的日期格式:比使用我的第二种方法@invoices.map { |invoice| invoice.date.to_s(:my_format) } 如果您给它一个更好的名称my_format 它可以在任何地方重复使用该应用程序,您无需记住此模式"%d/%m/%Y"。而且以后换成另一种模式更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2018-06-17
    • 2014-06-04
    相关资源
    最近更新 更多