【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.)