Убрать условия с рельсов front-end html slim

В моем внешнем html.slim файле рельсов есть следующий код. Я хочу удалить эти вложенные if-else условия. Могу ли я реализовать это, переместив эти условия if-else в какой-нибудь вспомогательный класс?

  - if @current_task.task_type == 'econsent'
    - if @patient_organization.organization.identity_verification
      - if @patient_organization.manual_verified
        - if session['kiosk_token']
          = render "#{@current_task.task_type}_tasks"
        - else
          - if @reauthenticated
            = render "#{@current_task.task_type}_tasks"
          -  else
            = render 'relogin_required_screen'
      - else
        = render 'manual_verification_required_screen'
    - else
      - if @patient.self_verified
        - if session['kiosk_token']
          = render "#{@current_task.task_type}_tasks"
        - else
          - if @reauthenticated
            = render "#{@current_task.task_type}_tasks"
          -  else
            = render 'relogin_required_screen'
      - else
        - if @patient.self_verification_req_sent
          = render 'verify_email_after_sent_screen'
        - else
          = render 'verify_email_screen'
  - else
    = render "#{@current_task.task_type}_tasks"

person Usman Asif    schedule 08.05.2018    source источник


Ответы (2)


Я думаю, вам нужно реорганизовать эти условия, а не просто переместить их в другое место. Например: есть 5 различных условий, которые заканчиваются на render "#{@current_task.task_type}_tasks", вам нужно найти то, что у них есть в comum, вам не нужно так много условных выражений. Взгляните на использование if, elsif, else и unless.

person sad parrot    schedule 08.05.2018

Я считаю, что вы могли бы просто назначить переменную @to_render в своем действии контроллера, например:

class FooController < ApplicationController

  def bar_action
    ...
    @to_render = get_to_render
    ...
  end

private

  def get_to_render
    if current_task_type == 'econsent'
      if @patient_organization.organization.identity_verification
        if @patient_organization.manual_verified
          return :relogin_required_screen if (!@reauthenticated && !kiosk_token?)
        else
          return :manual_verification_required_screen
        end
      else
        if @patient.self_verified
          return :relogin_required_screen if (!@reauthenticated && !kiosk_token)
        else
          return @patient.self_verification_req_sent ? :verify_email_after_sent_screen : :verify_email_screen
        end
      end
    end
    return "#{current_task_type}_tasks".to_sym
  end

  def kiosk_token?
    session['kiosk_token']
  end

end

Затем в вашем html.slim файле выполните:

= render @to_render

Не могу вспомнить, но вам может понадобиться:

= render "#{@to_render}"

поскольку @to_render будет символом. Выполнение строковой интерполяции автоматически преобразует символ в строку.

person jvillian    schedule 08.05.2018