تغییر متن پیغام validate در ریلز ؟

سلام سال نو مبارک:smile:
من میخوام وقتی یه فرم validate میکنم مثلا اگه گفتم 255 کارکتر بیشتر نشه پیغام

Name is too long (maximum is 255 characters)

نده و هر پیغامی که دوست دارمو نمایش بدم.
چطور این کار ممکنه؟؟

اینطوری:

validates_length_of :text, in: 0..255, message: "This is too big"

یا اینطوری:

validates_length_of :user_name, within: 6..20, too_long: 'pick a shorter name', too_short: 'pick a longer name'
1 پسندیده

مثال

validates_presence_of :name , message: "Plase insert subject name !"

اینم میشه خروجیش

Name Plase insert subject name !

حالا من میخوام اون name اول ام عوض کنم اصلا فارسی بزارم اینو چه کنم که از همون اتریبیوت استفاده کنم ولی اسمشو برا نمایش خطا عوض کنم

باید از I18n ریلز استفاده کنید و زبان دیفالت رو بزارید روی فارسی.

# config/application.rb
config.i18n.default_locale = :fa

بعد میتونید از جم rails-i18n استفاده کنید یا محتویات این فایل رو بریزید تو آدرس config/locales/fa.yml. برای اینکه اسم مشخصه‌های مدل رو به فارسی ترجمه کنید، به فرض اینکه یک مدل Post و یک مدل Comment داشته باشید، می‌تونید داخل fa.yml این‌ها رو اضافه کنید:

fa:
  activerecord:
    models:
      post: "پست"
     comment: "نظرات"
    attributes:
      post:
        title: "عنوان"
        body: "پست"
      comment:
        sender: "ارسال کننده"
        body: "متن"

برای اطلاعات بیشتر مستندات ریلز رو بخونید.

1 پسندیده

این سوال خوبیه و @TheArashM جواب رو دادن.

حالا یک سوال دیگه پیش میاد;
به نظر من اینکه ما هم باید مدل و در کل schema خوبی طراحی کنیم و هم تک تک فیلد ها رو validate کنیم یکمی کار رو کند و پیچیده میکنه. مثلا اگر فیلدی داریم که CHAR 255 هست خوب دیگه یعنی منظورمون همین بوده که کرکترها بیشتر نباشن پس چرا بازم نیاز داریم که دستی Validate کنیم؟!! برای رفع این مشکل جمی هست به نام valhammer که وقتی schema یا همون database را خوب طراهی کرده باشیم, این جم به صورت خودکار validation را انجام میده و ما وقتمون رو برای بهبود دیتا بیس صرف می کنیم . مگر اینکه validation های پیچیده تری لازم داشته باشیم و اون موقع هست که دستی عمل میکنیم.
من هر روز از این جم استفاده میکنم و هر سوالی در موردش باشد را میتونم پاسخ بدم.

1 پسندیده

من برای اجرا این به error میخورم

ActionView::Template::Error (can not load translations from /home/moh/sites/Cms/config/locales/en.yml: expects it to return a hash, but does not):
    1: 	<%= error_messages_for (@subject) %>
    2: 	<div class="form-group">
    3: 		<%= jex.label(:name, class: "col-sm-2 control-label") %>
    4: 		<div class="col-sm-10 form-padding "><%= jex.text_field(:name ,:class => "form-control") %></div>
    5: 	</div>
    6: 
  app/views/subjects/_form.html.erb:3:in `_app_views_subjects__form_html_erb___413945265320941701_70097390338460'
  app/views/subjects/edit.html.erb:5:in `block in _app_views_subjects_edit_html_erb___4003724572555808626_70097389847960'
  app/views/subjects/edit.html.erb:4:in `_app_views_subjects_edit_html_erb___4003724572555808626_70097389847960'


  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (73.7ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (33.3ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (3.4ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (175.0ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/_markup.html.erb (1.5ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (1.0ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (2.6ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/style.css.erb within layouts/inlined_string (1.3ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/console.js.erb within layouts/javascript (1563.4ms)
  Rendered /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/index.html.erb (1596.0ms)

ActionView::Template::Error: can not load translations from /home/moh/sites/Cms/config/locales/en.yml: expects it to return a hash, but does not

اینم fa.yml

fa:
  activerecord:
  models:
     admin_user: "مدیر"
     page: "صفحه"
     section: "قسمت"
     subject: "موضوع"
    attributes:
      subject:
        name: "نام"
        position: "موقیعت"

این دستورم تو config اضافه کردم.

config.i18n.default_locale = :fa

خیلی خوب میشه یکی از دوستان یه sample project درست کنه که توش همه ترفندای فارسی کردن باشه تا بعد ها هم کسی خواست کارکنه لینکش بدیم به اون

 #config/application.rb
config.i18n.default_locale = :fa
config/locales/fa.yml
fa.yml

اونا رو کانفیگ کردم

از طرفی وقتی همین fa.yml تو سایت http://www.yamllint.comبررسی میکنیم میگه مشکل داره

models باید زیر activerecord باشه. ضمن اینکه فایل config/locales/en.yml باید از قبل وجود داشته باشه. اگه فایل en.yml وجود داره و هنوز خطا داری سرور رو ری‌استارت کن.

models که زیر اونه en.yml از قبل بود سرور ام ریستارت کردم ارور هست

ActionView::Template::Error: can not load translations from /home/moh/sites/Cms/config/locales/fa.yml: #<Psych::SyntaxError: (/home/moh/sites/Cms/config/locales/fa.yml): did not find expected key while parsing a block mapping at line 2 column 3>
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/base.rb:184:in `rescue in load_yml'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/base.rb:181:in `load_yml'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/base.rb:165:in `load_file'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/base.rb:15:in `block in load_translations'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/base.rb:15:in `each'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/base.rb:15:in `load_translations'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/simple.rb:57:in `init_translations'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/backend/simple.rb:40:in `available_locales'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/config.rb:43:in `available_locales'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n/config.rb:49:in `available_locales_set'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n.rb:278:in `locale_available?'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n.rb:284:in `enforce_available_locales!'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/i18n-0.7.0/lib/i18n.rb:151:in `translate'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/helpers/translation_helper.rb:69:in `translate'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/view.rb:34:in `t'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/console.js.erb:95:in `__home_moh__rvm_gems_ruby_______gems_web_console_______lib_web_console_templates_console_js_erb__3504662335268964650_69948868269060'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/template.rb:145:in `block in render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:166:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/template.rb:333:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/template.rb:143:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:in `block in instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:53:in `block in render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:52:in `render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:14:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/renderer.rb:42:in `render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/renderer.rb:23:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/helpers/rendering_helper.rb:32:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/view.rb:17:in `render_javascript'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/templates/index.html.erb:3:in `__home_moh__rvm_gems_ruby_______gems_web_console_______lib_web_console_templates_index_html_erb__1171156280810062560_69948868364380'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/template.rb:145:in `block in render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:166:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/template.rb:333:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/template.rb:143:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/abstract_renderer.rb:39:in `block in instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:in `block in instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/abstract_renderer.rb:39:in `instrument'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:53:in `block in render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:52:in `render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:14:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/renderer.rb:42:in `render_template'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/renderer/renderer.rb:23:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionview-4.2.5.1/lib/action_view/helpers/rendering_helper.rb:32:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/template.rb:20:in `render'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/middleware.rb:42:in `block in call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/middleware.rb:18:in `catch'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/web-console-2.3.0/lib/web_console/middleware.rb:18:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/rack/logger.rb:38:in `call_app'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/rack/logger.rb:20:in `block in call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/tagged_logging.rb:68:in `block in tagged'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/tagged_logging.rb:26:in `tagged'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/tagged_logging.rb:68:in `tagged'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/rack/logger.rb:20:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/request_id.rb:21:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/methodoverride.rb:22:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/runtime.rb:18:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/lock.rb:17:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/static.rb:116:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/sendfile.rb:113:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/engine.rb:518:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/application.rb:165:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/lock.rb:17:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/content_length.rb:15:in `call'
	from /home/moh/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service'
	from /home/moh/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
	from /home/moh/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'

from /home/moh/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'

تو فایل fa.yml اون models باید زیر activerecord باشه. به پست دومم که نمونه رو گذاشتم دقت کن. indentهات اشتباهه. attributes هم زیر models نیست.

1 پسندیده

اینو توی console اجرا کن و error بگو

rails c
YAML.load(File.open('config/locales/fa.yml'))`

با @TheArashM موافقم.
خط های زیرو هم اگه به کارت میاد به user settings تو sublime اضافه کن

"trim_trailing_white_space_on_save": true,
"tab_size": 2,
"ensure_newline_at_eof_on_save": true,
"translate_tabs_to_spaces": true,
"detect_indentation": true
1 پسندیده

اوکی شد و دیگه ارور نداشتم نمیدونستم ایندنت هام مهمن ممنون
ولی الان خودش اتومات ارور ها رو فارسی کرد بدونه اینکه من بش بگم شاید بخاطر (gem ‘rails-i18n’) ولی اتریبیوتشو نه من میخوام اون اتریبیوتم عوض بشه به همون نامی که گذاشتم

1 پسندیده

دقت نمیکنی کلا. تو پست قبلی هم گفتم attributes نباید parentش models باشه. indentهات رو چک کن درست باشن.

1 پسندیده

شرمنده .اره درست میگی ایندنت ها باید دوتا دوتا باش من رعایت نکردم الان همچی اوکی شد بسیار ممنون از @TheArashM و @toomaj واقعا کمک خوبی بود .دمتون گرم

1 پسندیده

من که شخصا روزی صدتا مشکل اینجوری دارم :frowning: , مهم اینه که بتونی درستشون کنی. :wink:

1 پسندیده

http://www.yaml.org/start.html