suin.io

Rails: simple_formの日本語エラーメッセージに主語をつける方法

suin2016年8月23日

Railsのsimple_formのエラーメッセージは主語(もしくは目的語)がないものがデフォルトで表示されるようになっています。例えば、入力必須のバリデーションでは、「を入力してください」のように日本語としては不自然なエラーメッセージになります。本稿では、エラーメッセージに主語をつけるようにする方法を紹介します。

initializerを書く方法

最初に見つけたのはsimple_formで表示されるエラーをfull_messagesのものにする - なんとなく日々徒然とで紹介されているintializerを書く方法です。config/initializer/simple_form_error_path.rbというファイルを作り、そこに以下の設定を書きます:

config/initializer/simple_form_error_path.rb
module SimpleForm::Components::Errors
  def errors_on_attribute
    object.errors.full_messages_for(attribute_name)
  end
end

これは、simple_form 3.1.0 未満での対処法になります。3.1.0以降では、simple_formの設定で簡単に変えられるようになっているので、この方法を使う必要はありません。

simple_formの設定で対応する方法

config/initializers/simple_form.rbでコメントアウトされているb.use :full_errorの部分を活かすようにします。

config/initializers/simple_form.rb
    ## full_messages_for
    # If you want to display the full error message for the attribute, you can
    # use the component :full_error, like:
    #
    b.use :full_error, wrap_with: { tag: :span, class: :error }

一方で、simple_formのTwitter Bootstrapを使っている場合は、config/initializers/simple_form_bootstrap.rbのb.use :errorb.use :full_errorに一括変換します。

diff --git a/config/initializers/simple_form_bootstrap.rb b/config/initializers/simple_form_bootstrap.rb
index 109d29a..4161b33 100644
--- a/config/initializers/simple_form_bootstrap.rb
+++ b/config/initializers/simple_form_bootstrap.rb
@@ -14,7 +14,7 @@ SimpleForm.setup do |config|
     b.use :label, class: 'control-label'

     b.use :input, class: 'form-control'
-    b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
     b.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
   end

@@ -26,7 +26,7 @@ SimpleForm.setup do |config|
     b.use :label, class: 'control-label'

     b.use :input
-    b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
     b.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
   end

@@ -38,7 +38,7 @@ SimpleForm.setup do |config|
       ba.use :label_input
     end

-    b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
     b.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
   end

@@ -47,7 +47,7 @@ SimpleForm.setup do |config|
     b.optional :readonly
     b.use :label, class: 'control-label'
     b.use :input
-    b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
     b.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
   end

@@ -62,7 +62,7 @@ SimpleForm.setup do |config|

     b.wrapper tag: 'div', class: 'col-sm-9' do |ba|
       ba.use :input, class: 'form-control'
-      ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+      ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
       ba.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
     end
   end
@@ -76,7 +76,7 @@ SimpleForm.setup do |config|

     b.wrapper tag: 'div', class: 'col-sm-9' do |ba|
       ba.use :input
-      ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+      ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
       ba.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
     end
   end
@@ -90,7 +90,7 @@ SimpleForm.setup do |config|
         ba.use :label_input
       end

-      wr.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+      wr.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
       wr.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
     end
   end
@@ -103,7 +103,7 @@ SimpleForm.setup do |config|

     b.wrapper tag: 'div', class: 'col-sm-9' do |ba|
       ba.use :input
-      ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+      ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
       ba.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
     end
   end
@@ -118,7 +118,7 @@ SimpleForm.setup do |config|
     b.use :label, class: 'sr-only'

     b.use :input, class: 'form-control'
-    b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+    b.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
     b.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
   end

@@ -128,7 +128,7 @@ SimpleForm.setup do |config|
     b.use :label, class: 'control-label'
     b.wrapper tag: 'div', class: 'form-inline' do |ba|
       ba.use :input, class: 'form-control'
-      ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
+      ba.use :full_error, wrap_with: { tag: 'span', class: 'help-block' }
       ba.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
     end
   end
RELATED POSTS