【Rails】Slim으로 중첩되어 있는 요소의 부모 태그만을 분기시킨다

12892 단어 Rails슬림
Slim에서 중첩된 자식 태그는 그대로, 부모 태그만 전환하고 싶은 경우를 쓰는 방법으로 빠져서 메모.

구체적으로는 이런 느낌의 HTML을 출력하고 싶을 때입니다.

요청하는 HTML

<div class="User__list">

  <!-- 選択中ユーザの場合、親タグをaタグではなくdivタグにしたい -->
  <div class="User__listSection--selected">
    <div>[ユーザ名]</div>
    <div>[メールアドレス]</div>
  </div>

  <a class="User__listSection"> <!-- hrefは割愛 -->
    <div>[ユーザ名]</div>
    <div>[メールアドレス]</div>
  </a>

  <a class="User__listSection">
    <div>[ユーザ名]</div>
    <div>[メールアドレス]</div>
  </a>

  ...

</div>

안 좋은 예



직관적으로는 이렇게 쓰고 싶은 곳입니다만, slim에는 end 가 없기 때문에 이것이라고 에러가 되어 버립니다.

슬림
.User__list
  - users.each do |user|
    - if current_user == user
      .User__listSection--selected
    - else
      a.User__listSection
    - end / slimに end は無いのでエラー!
        div #{user.name}
        div #{user.email}

실현 가능하지만 미묘한 예



가장 소박하게 하면 이렇게 된다고 생각합니다.

슬림
.User__list
  - users.each do |user|
    - if current_user == user
      / 選択中ユーザの場合、親タグをaタグではなくdivタグにする
      .User__listSection--selected
        div #{user.name}
        div #{user.email}
    - else
      a.User__listSection
        div #{user.name}
        div #{user.email}

이것은 중첩 태그를 2회 쓰고 있어 중복이므로 별로 바람직하지 않네요. 유지 보수성도 매우 나쁘다.

동적 태그를 사용하여 조금 스마트하게 작성한 예



동적 태그 을 사용하면 중첩 태그는 한 번만 쓰면 끝나게 됩니다.

슬림
ruby:
  def user_list_section_tag(current_user, user)
    if current_user == user
      # 選択中ユーザの場合、親タグをaタグではなくdivタグにする
      { tag: 'div', class: 'User__listSection--selected' }
    else
      { tag: 'a', class: 'User__listSection' }
    end
  end

.User__list
  - users.each do |user|
    *user_list_section_tag(current_user, user)
      div #{user.name}
      div #{user.email}

복잡한 분기가 있는 경우는 동적 태그를 사용하면 좋을 것 같습니다만, slim 안에 갑자기 ruby가 나오는 것은 조금 기분 나쁜 생각이 듭니다.

content_tag를 사용하여 작성한 예



content_tag 에서 태그를 생성하면 slim에 ruby를 작성하지 않고 완료됩니다.

슬림
.User__list
  - users.each do |user|
    - user_list_section_attrs = current_user == user \
      ? { class: "User__listSection--selected" } \
      : { class: "User__listSection" }

    / 選択中ユーザの場合、親タグをaタグではなくdivタグにする
    = content_tag(current_user == user ? :div : :a, '', user_list_section_attrs)
      div #{user.name}
      div #{user.email}
content_tag 를 사용하면 확실히 Ruby를 쓰지 않고 끝납니다. 라는 생각도 듭니다.
하지만, 순수하게 slim만으로 쓸 수 있으므로 이쪽이 저는 좋다고 느끼고 있습니다.

더 똑똑한 방법이 있다면 누군가를 가르쳐주세요!

추가: 태그를 사용하여 더 스마트하게 작성한 예



@eRy-sk 씨에게 코멘트 로 더 나은 쓰기를 가르쳐 주셨습니다! 감사합니다!

태그current_user == user 로 생성하고 싶은 태그명을 분기해 건네줍니다.

슬림
.User__list
  - users.each do |user|
    - selected = current_user == user

    / 選択中ユーザの場合、親タグをaタグではなくdivタグにする
    = tag.send(selected ? 'div' : 'a', class: "User__listSection#{'--selected' if selected}")
      div = user.name
      div = user.email
send 그렇다면 제 2 인수가 슬프게 되고, 이 content_tag 를 사용하는 쓰는 방법이 좋을 것 같네요!

더 추가: content_tag로 더 스마트하게 작성한 예



@scivola 씨에게 코멘트 로 더 스마트한 쓰는 법을 가르쳐 주셨습니다! 감사합니다! ! !
tag 에 건네주는 인수로서, 태그명도 포함한 배열을 분기해 정의해 두어, 그것을 건네주도록(듯이) 합니다.

슬림
.User__list
  - users.each do |user|
    / 選択中ユーザの場合、親タグをaタグではなくdivタグにする
    - if current_user == user
      - args = [:div, class: "User__listSection--selected"]
    - else
      - args = [:a, class: "User__listSection"]
    = content_tag(*args)
      div = user.name
      div = user.email
content_tag 를 사용하지 않아도 되고, 이것이 현재 제일 스마트한 쓰는 방법, 라고 하는 곳입니까.

좋은 웹페이지 즐겨찾기