【问题标题】:html in helper with rails 5.1带有rails 5.1的助手中的html
【发布时间】:2018-09-12 22:45:14
【问题描述】:

我尝试使用 rails 5.1 构建一个助手。

我需要:

 <div class="card-sleep-body-price">
    <span>à partir de</span>
       <p>45.53€</
  </div>

我尝试构建:

  def sleep_price(poi)
      if !poi.tariffs.blank?
        tag.div class: 'card-sleep-body-price' do
          <span>à partir de</span>
          <p>poi.poitable.tariffs.first.price '€'</p>
        end
      end
  end

我该如何解决?

【问题讨论】:

  • 很高兴将自己设置为-1...但它没有回答我的问题...谢谢:D 对不起,如果我是新手 :(
  • 错误是什么?我的意思是,一定有语法错误,您应该在寻求帮助时发布错误。我想你可以对每个节点使用content_tag 方法,你就完成了apidock.com/rails/ActionView/Helpers/TagHelper/content_tag

标签: ruby-on-rails helper


【解决方案1】:

这是一种方法。修改了代码以使用引号和字符串插值,让 Ruby 知道什么是文字,什么是代码。

def sleep_price(poi)
  "<span>à partir de</span><p>#{poi.poitable.tariffs.first.price}€</p>"
end

但是,由于在帮助程序或视图中使用长链点符号被认为是一种不好的形式,因此请考虑在模型中执行此逻辑:

class Poi < ActiveRecord::Base
  belongs_to :poitable

  def price
    self.poitable.tariffs.first.price
  end

end

从某种意义上来说,你可以这样调用这个方法:

<%= sleep_price(match.sleep) %>

或者,您可以从控制器调用match.sleep,也许将其设置为视图中可用的实例变量。

助手可能看起来像:

def sleep_price(price)
  "<span>à partir de</span><p>#{price}€</p>"
end

【讨论】:

  • 如果表格不好?我能怎么做 ?有什么更好的方法?
  • 如果price 被传递给助手就好了。让您获得价格的链条poi.poitable.tariffs.first 理想情况下是模型,或者可能是控制器。例如,如果poi 始终只有一个价格,您可能希望在封装了该逻辑的Poi 模型中实现poi.price 方法。
  • 非常感谢您的帮助。我不确定我是否理解。你能举个例子给我解释一下吗?
  • 当然。我编辑了我的答案以举一个例子。如果这对你有用,请检查我的答案是否正确。
  • 非常感谢约翰的解释。如果 price 不是空白,您在哪里测试?在视图中?
【解决方案2】:

嗨,Ben,您可以使用 Rails content_tag 助手来构建 html 元素。

查看助手

def generate_price(label:, price:, class: "element-class")

content_tag :div, class: 类做

concat(content_tag(:span, label))

concat(content_tag(:p, price))

结束

结束

用法:

&lt;%= generate_price(label: à partir de, price: 45.53€)%&gt;

&lt;div class="element-class"&gt;&lt;span&gt;à partir de&lt;/span&gt;&lt;p&gt;45.53€&lt;/p&gt;&lt;/div&gt;

嵌套内容标签:https://robots.thoughtbot.com/nesting-content-tag-in-rails-3

content_tag:https://apidock.com/rails/ActionView/Helpers/TagHelper/content_tag

希望对你有帮助

【讨论】:

  • 仍然支持 content_tag 和 tag 方法的旧语法,但可能会在未来的 Rails 版本中被弃用和删除。 blog.bigbinary.com/2017/08/23/…
  • 感谢 ben 的信息,是的,它可能很快就会贬值,但目前还不确定,tag 帮助者解决了在 Rails 中构建 html 元素的大多数问题。
【解决方案3】:

我相信这是一种更优雅的方式:

def sleep_price(poi)
  return if poi.tariffs.blank?

  tag.div class: "card-sleep-body-price" do
    concat(tag.span "à partir de")
    concat(tag.p "#{poi.poitable.tariffs.first.price} €")
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 2014-02-08
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多