Best_in_place display_with 没有找到帮手
Posted
技术标签:
【中文标题】Best_in_place display_with 没有找到帮手【英文标题】:Best_in_place display_with not finding helper 【发布时间】:2012-11-13 17:37:06 【问题描述】:关于如何在 Best In place 中使用 display_with 选项的文档并不多,但我正在尝试让 Best_in_Place 以精简形式(mm/dd/yyyy)显示日期。 我的数据库(sqlserver)以日期时间格式存储日期,我使用此命令显示该字段:
<%= best_in_place(@production, :budget_approval_internal, type: :date, :nil => "[Not set]") %>
单击 gem 时,按预期工作,放置一个日历控件以选择日期,然后以简短形式显示它。但是当我按下刷新时,我得到的日期看起来像:
2013-12-04 00:00:00 UTC
所以我想我可以使用 :display_with 选项来使用如下所示的帮助器:
def format_date(my_date)
my_date.strftime('%m/%d/%Y')
end
我把它放在 application_helper.rb 模块中,然后尝试了这个:
<%= best_in_place(@production, :budget_approval_internal, type: :date, :display_with => :format_date, :nil => "[Not set]") %>
但我说错了:
“找不到帮助程序 format_date。有什么想法吗?
【问题讨论】:
【参考方案1】:您应该在控制器中 include ApplicationHelper
或将方法添加到相应的帮助文件中。
编辑:您需要打开 ActionView::Base 类并添加您的方法
module ActionView
class Base
def format_date(rec)
rec.strftime('%m/%d/%Y')
end
end
end
【讨论】:
不,我相信 ApplicationHelper 自动包含在所有控制器中,但无论如何它都没有帮助。有趣的是,如果我只是将 放在视图中,它就可以正常工作。我不确定 format_date 应该如何从 :display_with 获取参数,但我假设这是 best_in_place 魔法的一部分。 看起来它只接受来自 ActionView 模块的助手。在 lib/best_in_place/helper.rb 中有一个检查ViewHelpers.respond_to?(opts[:display_with])
。 ViewHelpers 是这样创建的 BestInPlace::ViewHelpers = ActionView::Base.new
那么有没有办法以某种方式将此功能混入ActionView模块?
好主意。尝试在 ApplicationHelper 模块之后添加:module ActionView class Base def format_date(rec) rec.strftime('%m/%d/%Y') end end end
【参考方案2】:
也许您可以覆盖生产模型的budget_approval_internal
的setter 方法。这不是最好的解决方案,但如果您仅在此模型中使用 best_in_place 就可以了。
class Production
def budget_approval_internal
read_attribute(:budget_approval_internal).strftime("dd/mm/YY")
end
end
【讨论】:
我想到了这一点,但这并没有真正解决我为什么不能 :display_with 工作的问题。我必须处理的模型中有大约 30 个日期字段,而且似乎有很多不必要的代码。【参考方案3】:我遇到了同样的问题,并使用了 zubin 完成的 best_in_place 的拉取请求中的一个小 sn-p。
<%= in_place_edit(@term, :starts_on, display_with: lambda |dt| ldt(dt) , html_attrs: datepicker: "true") %>
这里的 ldt 是采用日期对象并转换为我想要的格式的方法。
希望对你有帮助
【讨论】:
【参考方案4】:我自己也遇到了类似的问题。对于像您这样的简单格式化方法,您应该只使用:display_as
而不是:display_with
。
您在视图中的 b_i_p 代码将使用 :display_as => format_date
。
然后将format_date
方法放入您的模型中。去掉参数,改写方法如下:
def format_date
self.my_date.strftime('%m/%d/%Y')
end
无需使用 ApplicationHelper。
【讨论】:
以上是关于Best_in_place display_with 没有找到帮手的主要内容,如果未能解决你的问题,请参考以下文章