Упростите повторяющуюся строку с помощью оператора case ruby - PullRequest
1 голос
/ 10 июля 2020
case params[:application]
  when "cbeweb"
    token = CognifySession.find_or_create(user).access_token
  when "idweb"
    token = ComposeSession.find_or_create(user).access_token
  else
    token = Session.find_or_create(user).access_token
end

Как видите, он очень повторяющийся, поскольку find_or_create(user).access_token продолжает появляться. В ruby, что является предпочтительным способом удалить большую часть этого повторения token = {class name}.find_or_create(user).access_token

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Переместите этот повторяющийся код за пределы журнала выбора класса c.

klass = {
  "cbeweb" => CognifySession,
  "idweb" => ComposeSession,
}.fetch(params[:application], Session)

token = klass.find_or_create(user).access_token
1 голос
/ 10 июля 2020

Хотя этот ответ мало чем отличается от ответа Серджио Туленцева . Хочу добавить предложение по реализации. Поскольку вы, по-видимому, используете это в контроллере Rails.

Если вам это нужно в нескольких контроллерах и / или несколько раз в одном контроллере, подумайте о добавлении частного метода, который извлекает этот класс.

class ApplicationController < ActionController::Base
  SESSION_CLASSES = {
    'cbeweb' => CognifySession,
    'idweb'  => CognifySession,
  }
  SESSION_CLASSES.default = Session
  SESSION_CLASSES.freeze

  private

  def session_class
    # Assuming this is always based upon the params[:application] value.
    # If not, pass the string as method parameter instead.
    SESSION_CLASSES[params[:application]]
  end
end
class SomeController < ApplicationController
  def some_action
    token = session_class.find_or_create(user).access_token
  end
end
...