【问题标题】:Using helper in model在模型中使用助手
【发布时间】:2016-01-18 15:34:17
【问题描述】:

我可以在 model 中使用什么助手来将 html 代码 填充为 view 中的 string

这是我目前在我的模型中使用的方法:

 def state_country_name
    "#{self.name}  (#{self.country.name})"
 end

我想用class: pull-right{self.country.name} 包裹在一个span 中。

我已经试过了:

  def state_country_name
    "#{self.name} #{helpers.content_tag(:span, self.country.name, class: "pull-right")}"
  end

  def helpers
    ActionController::Base.helpers
  end

结果

London <span>England</span>

我使用 autocomplete-rails4-gem,这是我的表单输入:

= f.input :city_name, :url => autocomplete_city_name_companies_path, :as => :autocomplete, :id_element => "#company_city_id", input_html: {:value => @company.city.name, class: 'form-control'}

我的autocomplete_city_name_companies 操作代码:

autocomplete :city, :name, :full => false, :display_value => :state_country_name, :extra_data => [:state_id]

【问题讨论】:

  • 为什么要在模型中这样做?
  • 是的,如前所述,在视图中 是 html 代码而不是视图中的字符串。
  • 那你也应该在前端做。永远不要在模型中生成 HTML
  • @Rubioli 这对于演示者来说是一个很好的用例 - draper 相当受欢迎。这将允许您使用自动完成 gem,并以干净的方式添加该方法。
  • @Rubioli,演示者不必大而臃肿,这不是什么大事,引入该模式的好处是长期存在的。我在下面编写了一些示例代码来演示这一点。

标签: ruby-on-rails ruby model helper


【解决方案1】:

我建议在这里采用 Presenter 方法,因为它可以让您放置可以与 ruby​​ 模型一起使用但其逻辑不属于模型本身的表示逻辑。您可以使用 Draper 或执行此操作的其他几个 gem 之一,但这里有一些代码来演示这个概念是多么简单:

演示者示例:

class CompanyPresenter < Struct.new(:company)
  def state_country_name
    company.country.name
  end

  # act as proxy for unknown methods
  def method_missing(method, *args, &block)
    company.public_send(method, *args, &block)
  end
end

@presentable_company = CompanyPresenter.new(@company)

或者如果你想采用装饰器方法:

module CompanyPresenter
  def state_country_name
    country.name
  end
end

class Company < ActiveRecord::Base
  def decorate!
    self.extend CompanyPresenter
  end
end

@company.decorate!

【讨论】:

    【解决方案2】:

    我认为你不应该在你的模型中这样做。而是将您的助手方法放在您的助手文件中。 在你的 model_helper.rb 中:

    def my_helper(model)
    html = <<-EOT
    <span class="pull-right">{model.country.name}</span>
    EOT
    html.html_safe
    end
    

    在你看来:

    <%= my_helper(@model_object) %>
    

    【讨论】:

    • 请注意不要将html_safe 用于实际上可能不“安全”的任何内容(主要是来自未知来源的数据)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2011-04-20
    • 1970-01-01
    • 2014-05-12
    • 2012-12-07
    • 2019-04-02
    • 2011-11-02
    相关资源
    最近更新 更多