일반적인 bbcode 래퍼를 사용하여 그룹 문자열 변수에 속하지 않으면 내용을 숨기는 테마 컴포넌트를 생성
초안 보기
일반적인 BBCode 래퍼 및 테마 컴포넌트 생성
요구 사항 이해
요청 사항에 따라 다음을 생성할 것입니다:
사용자 정의 속성을 받을 수 있는 일반적인 BBCode 래퍼.
BBCode 래퍼에 전달되는 그룹 문자열 변수에 기반하여 내용을 숨기는 테마 컴포넌트.
BBCode 래퍼 구현
임의의 속성을 받을 수 있는 BBCode 래퍼를 생성합니다. 이러한 속성은 평가하기 위해 테마 컴포넌트로 전달됩니다.
Ruby
# config/initializers/bbcode.rb
Discourse::Plugins::BBCode.add_parser(:hide_if_not_in_group) do |tag, content|
attributes = tag.attributes || {}
"<div class='hide-if-not-in-group' data-group-names='#{attributes[:groups]}'>#{content}</div>"
end
코드를 신중하게 사용하세요.
테마 컴포넌트 생성
테마 컴포넌트는 현재 사용자가 data-group-names 속성에 지정된 그룹 중 하나에 속하는지 확인합니다. 속하지 않는 경우, 내용은 숨겨집니다.
JavaScript
// app/assets/javascripts/discourse/components/hide-if-not-in-group.js
import Component from 'discourse/components/component';
export default Component.extend({
tagName: 'div',
classNames: ['hide-if-not-in-group'],
didInsertElement() {
const currentUserId = Discourse.currentUser.id;
const groupNames = this.element.dataset.groupNames.split(',');
// 사용자가 지정된 그룹 중 하나에 속하는지 확인하는 함수
const userIsInAnyGroup = (userId, groupNames) => {
// 사용자 그룹 멤버십을 확인하는 로직으로 이 부분을 교체하세요
// 예를 들어, Discourse API 또는 사용자 정의 로직 사용
return groupNames.some(groupName => {
// 사용자가 `groupName`이라는 이름의 그룹에 속하는지 확인
// 사용자가 그룹에 속하면 true, 아니면 false 반환
});
};
if (!userIsInAnyGroup(currentUserId, groupNames)) {
this.element.style.display = 'none';
}
}
});
코드를 신중하게 사용하세요.
BBCode 사용
BBCode는 다음과 같이 사용할 수 있습니다:
[hide_if_not_in_group groups="staff,moderators"]
이 내용은 스태프나 모더레이터가 아닌 사용자에게는 숨겨집니다.
[/hide_if_not_in_group]
중요한 고려 사항
그룹 멤버십 확인: 사용자 그룹 멤버십을 확인하는 자리 표시자 로직을 실제 구현으로 교체해야 합니다. 그룹 멤버십을 결정하기 위해 Discourse API 또는 사용자 정의 로직이 필요할 수 있습니다.
성능: 사용자 또는 그룹 수가 많은 경우, 그룹 멤버십 확인을 최적화해야 할 수 있습니다.
보안: 보안 취약점을 방지하기 위해 그룹 이름에 대한 적절한 검증과 제거(sanitization)를 보장하세요.
유연성: 다른 동작(예: 내용을 숨기는 대신 메시지 표시)을 제어하기 위해 BBCode에 추가 속성을 허용하는 것을 고려하세요.
이 단계를 따르면 그룹 멤버십에 기반하여 내용을 숨길 수 있는 유연한 BBCode 래퍼와 테마 컴포넌트를 갖출 수 있습니다.
Gemini를 사용했습니다. 위의 코드 스니펫을 얻을 수 있었지만 작동시키는 데 어려움을 겪고 있습니다.
커스텀 컴포넌트에 어디에 배치해야 하는지, 그리고 코드를 수정해야 하는 부분이 어디인지 안내해 주실 수 있을까요?
JavaScript를 common에 넣었을 때 “import” 라인이 {를 예상하지 않는다는 오류가 발생했습니다.

