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。

&lt;%= in_place_edit(@term, :starts_on, display_with: lambda |dt| ldt(dt) , html_attrs: datepicker: "true") %&gt;

这里的 ldt 是采用日期对象并转换为我想要的格式的方法。

希望对你有帮助

【讨论】:

【参考方案4】:

我自己也遇到了类似的问题。对于像您这样的简单格式化方法,您应该只使用:display_as 而不是:display_with

您在视图中的 b_i_p 代码将使用 :display_as =&gt; format_date

然后将format_date 方法放入您的模型中。去掉参数,改写方法如下:

def format_date
   self.my_date.strftime('%m/%d/%Y')
end

无需使用 ApplicationHelper。

【讨论】:

以上是关于Best_in_place display_with 没有找到帮手的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails + best_in_place + 数据表 + haml

best_in_place 错误 ID 为 nil

best_in_place - 在视图中使用更新的值

best_in_place 日期选择器格式

Best_in_place 集合 1 到多个关联

找不到文件“best_in_place.purr”