使用 helper/service 的 rails4 以及放置位置
rails4 using helper/service and where to put it
我创建这个 class 是为了根据产品属性的长度组装文本,以便在 Twitter 上分享。
我的问题:
- 这是解决问题的好方法吗?如果不是这个那又是什么? (我应该把 class 和方法放在哪里,如何调用它等等)
- 如果这是好的方法,那么应该改变什么?例如我觉得
def twitter_share_text
不应该在 product.rb
.
show.html.erb
<a class="twitter-share" data-behavior="twitter-share"
data-twittertext="<%= @product.twitter_share_text %>"
data-twitterurl="<%= product_url(@product) %>"
data-twitteranchor>
<i class="fa fa-lg fa-twitter"></i>
</a>
product.rb
def twitter_share_text
TwitterProductShare.new(self).return_text
end
app/services/twitter_product_share.rb
class TwitterProductShare
URL_LENGTH = 23 #defined by twitter API
SPACE_LENGTH = 1
TWITTER_MAX = 140
attr_reader :name, :oneliner
def initialize(product)
@name = product.name
@oneliner = product.oneliner
end
def return_text
if full_length <= TWITTER_MAX
return basic_text
else
return basic_text[0...-(difference + text_end.length)] + text_end
end
end
private
def basic_text
"#{name}: #{oneliner}"
end
def difference
full_length - TWITTER_MAX
end
def full_length
basic_text.length + SPACE_LENGTH + URL_LENGTH
end
def text_end
"..."
end
end
我认为这样的代码属于视图助手:
# in app/helpers/product_helper.rb
def twitter_share_link(product)
data = {
behavior: 'twitter-share',
twittertext: TwitterProductShare.new(product).return_text,
twitterurl: product_url(product),
twitteranchor: 'twitteranchor'
}
link_to(class: 'twitter-share', data: data) do
tag(:i, class: 'fa fa-lg fa-twitter')
end
end
在您看来,可以这样使用此助手:
<%= twitter_share_link(@product) %>
或者您甚至可以 return 来自 TwitterProductShare
的整个 data
散列。
我创建这个 class 是为了根据产品属性的长度组装文本,以便在 Twitter 上分享。
我的问题:
- 这是解决问题的好方法吗?如果不是这个那又是什么? (我应该把 class 和方法放在哪里,如何调用它等等)
- 如果这是好的方法,那么应该改变什么?例如我觉得
def twitter_share_text
不应该在product.rb
.
show.html.erb
<a class="twitter-share" data-behavior="twitter-share"
data-twittertext="<%= @product.twitter_share_text %>"
data-twitterurl="<%= product_url(@product) %>"
data-twitteranchor>
<i class="fa fa-lg fa-twitter"></i>
</a>
product.rb
def twitter_share_text
TwitterProductShare.new(self).return_text
end
app/services/twitter_product_share.rb
class TwitterProductShare
URL_LENGTH = 23 #defined by twitter API
SPACE_LENGTH = 1
TWITTER_MAX = 140
attr_reader :name, :oneliner
def initialize(product)
@name = product.name
@oneliner = product.oneliner
end
def return_text
if full_length <= TWITTER_MAX
return basic_text
else
return basic_text[0...-(difference + text_end.length)] + text_end
end
end
private
def basic_text
"#{name}: #{oneliner}"
end
def difference
full_length - TWITTER_MAX
end
def full_length
basic_text.length + SPACE_LENGTH + URL_LENGTH
end
def text_end
"..."
end
end
我认为这样的代码属于视图助手:
# in app/helpers/product_helper.rb
def twitter_share_link(product)
data = {
behavior: 'twitter-share',
twittertext: TwitterProductShare.new(product).return_text,
twitterurl: product_url(product),
twitteranchor: 'twitteranchor'
}
link_to(class: 'twitter-share', data: data) do
tag(:i, class: 'fa fa-lg fa-twitter')
end
end
在您看来,可以这样使用此助手:
<%= twitter_share_link(@product) %>
或者您甚至可以 return 来自 TwitterProductShare
的整个 data
散列。