【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 를 사용하지 않아도 되고, 이것이 현재 제일 스마트한 쓰는 방법, 라고 하는 곳입니까.
                Reference
이 문제에 관하여(【Rails】Slim으로 중첩되어 있는 요소의 부모 태그만을 분기시킨다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mishiwata1015/items/407e924263d698ddeaae텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)