Rails 콘솔을 사용해 텍스트 템플릿 편집하는 법

Rails에서 user_notifications.user_watching_first_post.text_body_template와 같은 텍스트 템플릿을 직접 편집하고 싶습니다.

Rails에 익숙하지 않아 해당 객체를 찾지 못했습니다. Rails 콘솔 명령어를 알려주실 수 있나요?

(그걸 바로 어떻게 해야 할지 모르겠네요). 그건 어떤 문제를 해결하기 위한 건가요? UX나 API에서 처리하는 건 왜 안 되나요?

다른 주제와 관련이 있습니다: 3.2.x still ignores some custom email templates.

템플릿 수정이 무시되는 것 같습니다.

원하는 언어에 대해 편집하고 있는지 확인해 보셨나요?

네, 다만 이 문제와 더 관련이 있습니다.

템플릿 GUI가 버그가 너무 많아서 어떻게든 해결하고 싶습니다.

코드를 자세히 살펴본 것은 아니지만, 99% 확률로 문제가 UX 측이 아니라 Rails 측에 있다고 생각합니다. 따라서 Rails 측을 변경한다고 해서 문제가 해결될 가능성은 낮다고 봅니다. 예산이 있으시다면 요청하신 내용을 어떻게 구현할지 도움을 드릴 수는 있지만, 그것이 문제를 해결할 것이라고 약속하지는 않습니다.

변경한 항목은 다음과 같은 방식으로 찾을 수 있습니다:

TranslationOverride.all.pluck(:id, :translation_key)

그리고 다음과 같은 방식으로 업데이트할 수 있습니다.

to=TranslationOverride.find(1)
to.value="My new value for the override"
to.save

이 방법이 작동할지, 아니면 상황을 더 악화시킬지는 약속할 수 없습니다. 하지만 최악의 경우에도 UX에서 변경 사항을 되돌릴 수 있어야 합니다.

이 문제는 rails 쪽이 아니라 UI에서 허용된 태그 목록을 잘못 표시하고 있기 때문이라고 생각합니다(즉, 해당 목록이 어딘가에 잘못 하드코딩된 것입니다). 다만 %{base_url}은 다른 부분에서는 정상적으로 파싱됩니다(관련 스레드 참조). 따라서 rails를 사용하면 어떤 검사도 우회하여 값을 강제 저장할 수 있어야 합니다.

하지만 이 모든 것은 본론에서 벗어난 이야기입니다. 제 원래 질문은 rails에서 어떤 객체를 대상으로 해야 하는지에 대한 힌트를 구하는 것이었습니다. 유료 지원만 가능하시다면, 다른 누군가가 무료 도움을 주길 기다리겠습니다(다른 스레드나 GitHub PR에서도 그렇게 해왔습니다). 악의는 없습니다 :slight_smile:

수정: 제가 타이핑하는 동안 게시물을 수정하셨네요. 제안해 주신 대로 얼마나 진행될 수 있을지 해보겠습니다(제 특정 예시에 어떻게 적용해야 할지는 아직 확실하지 않습니다). TranslationOverride만으로도 충분히 힌트가 될 것 같습니다.

충분한 힌트가 되었고, 버그도 찾았습니다 (ruby 코드에 있는 버그입니다):

to=TranslationOverride.where(translation_key:"user_notifications.user_watching_category_or_tag.text_body_template").first
to.value="%{username} posted in \"[%{topic_title}](%{base_url}%{url})\"\n\n--"
to.save!
ActiveRecord::RecordInvalid: Validation failed: The following interpolation key is invalid: base_url
from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.8/lib/active_record/validations.rb:80:in `raise_validation_error'

validations.rb가 문제의 원인입니다 … base_url은 유효하며, 정상적으로 파싱됩니다 (링크된 스레드에서 설명했듯이). validations.rb를 해킹해야 합니다(으으!) 아니면 SQL 데이터베이스를 직접 편집해야 합니다(업그레이드 후에 제가 하려던 방법) … 이제 postgre 데이터베이스에서 이러한 템플릿 태그가 어디에 있는지 찾아야 합니다 :frowning:

p.s. 개발자들에게는 매우 쉽고 빠른 수정 사항입니다 (PR을 만들 수는 있지만, %{base_url}이 유효한 태그 목록에서 누락된 태그의 일부만 알고 있거든요).

실제로는:

to.save(validate: false)

… 이 코드가 정상적으로 작동했습니다.

수정: GUI에 즉시 표시되지 않았습니다 (sidekiq 캐싱 때문인 것 같습니다). 이를 위해 ./launcher restart app을 실행했습니다.

참고를 위해:

to=TranslationOverride.where(translation_key:"user_notifications.user_watching_category_or_tag.text_body_template").first
to.value="%{username} posted in \"[%{topic_title}](%{base_url}%{url})\"\n\n--"
to.save(validate: false)