小编Ric*_*dAE的帖子

Rails的服务对象的最佳实践 - 类方法或实例化

我正在按照我一直在研究的工作室实现"服务对象",我正在构建一个reddit API应用程序.我需要对象返回一些东西,所以我不能只在初始化器中执行所有操作.我有这两个选项:

选项1:类需要实例化

class SubListFromUser

  def user_subscribed_subs(client)
    @client = client
    @subreddits = sort_subs_by_name(user_subs_from_reddit)
  end

  private

  def sort_subs_by_name(subreddits)
    subreddits.sort_by { |sr| sr[:name].downcase }
  end 

  def user_subs_from_reddit
    @client.subscribed_subreddits :limit => 100
  end

end
Run Code Online (Sandbox Code Playgroud)

叫:

@subreddits = SubListFromUser.new(@client).user_subscribed_subs
Run Code Online (Sandbox Code Playgroud)

或者Option2将它作为一个类方法:

class SubListFromUser

  def self.user_subscribed_subs(client)
    sort_subs_by_name(client, user_subs_from_reddit)
  end

  private

  def self.sort_subs_by_name(subreddits)
    subreddits.sort_by { |sr| sr[:name].downcase }
  end 

  def self.user_subs_from_reddit(client)
    client.subscribed_subreddits :limit => 100
  end

end
Run Code Online (Sandbox Code Playgroud)

叫:

@subreddits = SubListFromUser.user_subscribed_subs(@client)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,什么被认为是"最佳实践"?有没有理由我不应该使用object.new(args).method?我认为它提供了一个更清洁的服务类,但我不确定这种方法的技术性,如果它有缺点.

编辑:或者选项3 - 我说这一切都错了,有一个更好的方法:)

ruby ruby-on-rails

6
推荐指数
2
解决办法
1560
查看次数

如何将参数传递给符号方法调用

我有一个模型关注点,它添加了一个方法't',允许模型字段转换为I18n:

module  Translatable
  extend ActiveSupport::Concern

  def t(field_name)
    I18n.t("models.#{self.class.table_name}.#{translation_tag}.#{field_name}")
  end
Run Code Online (Sandbox Code Playgroud)

模型:

class Model < ActiveRecord::Base
  include Translatable 
Run Code Online (Sandbox Code Playgroud)

使用以下方法几乎无处不在:

@model.t(:name)
Run Code Online (Sandbox Code Playgroud)

但是我有一个select字段,它使用此代码映射条目:

Model.all.order(name: :asc), :id, :name
Run Code Online (Sandbox Code Playgroud)

我想:名称使用可翻译的方法代替.以下工作,但我得到一个缺少参数错误(很明显为什么):

Model.all.order(name: :asc), :id, :t
Run Code Online (Sandbox Code Playgroud)

但是这不起作用:

Model.all.order(name: :asc), :id, :t(:name)
Run Code Online (Sandbox Code Playgroud)

将变量作为符号调用时,将变量传递给方法的正确方法是什么?

ruby ruby-on-rails ruby-on-rails-4

2
推荐指数
1
解决办法
843
查看次数

标签 统计

ruby ×2

ruby-on-rails ×2

ruby-on-rails-4 ×1