【问题标题】:Re-coding, can't use helper method in model重新编码,不能在模型中使用辅助方法
【发布时间】:2012-07-28 22:15:44
【问题描述】:

根据 MVC 进行编码的更好(正确)方法是什么?情况如下:

我的表单中有一个 collection_select,它工作正常,但是我想做这样的事情(注意选项的文本,第 4 个参数)

#Form.html.haml
= form_for(@payment) do |f|
 = f.collection_select(:invoice_id, Invoice.due, :id, :number + ' ' + money(:amount_due))

这行不通,因为据我所知,您无法连接符号。所以,我求助于这个:

#Form.html.haml
= form_for(@payment) do |f|
  = f.collection_select(:invoice_id, Invoice.due, :id, :number_with_amount_due)

#Invoice.rb
def number_with_amount_due
  "##{number} (#{money(amount_due)})"
end

如果我不尝试在模型中调用辅助方法,这会起作用。

那我该怎么办?能够在视图中连接选择文本会很好,但如果不可能,我怎样才能在 Rails 中保留正确的 MVC 的同时实现我想要做的事情?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model-view-controller


    【解决方案1】:

    因为我弄错了,所以对我的答案进行了大量编辑。

    使用 f.select,您将能够提供一个包含您需要的内容的数组。 假设 Invoice.due 返回您想要的 Invoice 集合

    这里是:

    f.select(:invoice_id, Invoice.due.map {|i| ["#{i.number} #{money(i.amount_due)}", i.id]})
    

    我认为 collection_select 无法实现您想要做的事情,除非您将包含 money 的助手添加到您的模型中。

    【讨论】:

    • 这不起作用,因为:= form_for(@payment) do |f| 是 f。我会将其添加到原始问题中。感谢您的评论
    • 如果付款has_one :invoice 使用 f.object.invoice.number 和 f.object.invoice.amount_due
    • 付款belongs_to :invoice,而不是“has_one”。当我尝试您的代码 (f.object.invoice.number) 时,出现错误:undefined method 'number' for nil:NilClass
    • 好主意,我喜欢它,我们正在接近。但是,我在每个选项的值和文本区域都得到了一个带有#<Invoice:0x64d356>(类似)的下拉列表。这(我很确定)意味着它想要显示对象而不是调用方法并显示它。任何想法为什么?
    • 是的,来晚了,我用each而不是map,试试吧,我编辑了答案
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多