Zapis w określonym tłumaczeniu (globalize)

Witam,

Mam pewien problem z zapisem tłumaczeń za pomocą globalize. Chodzi o to, że cała moja aplikacja używa lokalizacji ustalanej na początku jej działania za pomocą I18n.locale (w AplicationController). Ta zmienna określa, w którym języku aktualnie działa aplikacja. Następnie mam formularz, w którym zapisuje pola w określonym tłumaczeniu (pole wyboru języka) i tutaj pojawia się problem np. mam dwa języki en i pl, aktualnie aplikacja używa języka pl, w formularzu (wspomnianym powyżej) ustawiam, że chce napisać tłumaczenie dla języka en i wypełniam pole. Następnie zapisuję to:

# przykładowy kod zapisu
I18n.locale = @edit_locale # ustawiam wybrany język z formularza
@page = Page.new(page_params)
respond_to do |format|
   if @page.save
     format.html { redirect_to pages_path, notice: 'Page was successfully created.' }
   else
     format.html { render :new }
   end
end

I tu pojawia się problem, ponieważ po zapisie cała aplikacja zmienia język na en i zmieniają się tłumaczenia. Oczywiście ten problem można obejść poprzez tymczasową zmienną, która będzie przechowywała ten aktualnie używany język i na końcu po zapisie przywrócić ten język, ale nie da się tego zrobić lepiej? Z góry dzięki za pomoc.

Próbowałem tego, ale wtedy walidacja nie przechodzi (robiłem walidację dla wszystkich tłumaczeń) - chodzi o to, że w modelu nie mam dostępu do zmiennej params skąd mógłbym ściągnąć ten wybrany język, więc nie mogę ustalić które tłumaczenie aktualnie walidować (np. title_pl i title_en), a chce walidować w jednym momencie albo title_pl albo title_en. Problem rozwiązałem trochę inaczej:

<% Globalize.with_locale(edit_locale) do %>
  #odpowiedni kod
<% end %>

wybacz, ale nie rozumiem, jaki problem masz z ustawieniem walidacji ? w params z formularza przekazujesz stringi, i poźniej w modelu ustawiasz walidacje. Wykorzystując globalize-accessors pojawiaja ci sie pola title_pl, title_en, które możesz poddać walidacji. Ogólnie przy korzystaniu z globalize trzeba się trochę natrudzić żeby nie robiło ogromnej ilości zapytań do bazy, ale się da.

Tak, właśnie o tym piszę - mam pola title_pl, title_en, ale w 1 momencie chce walidować tylko 1 z tych pól czyli:

title_#{params[:edit_locale]}

Ale nie mogę tego zrobić, ponieważ w modelu nie mam dostępu do params.
Mógłbym użyć do walidacji samego pola title, ale wtedy będzie walidowane tłumaczenie na podstawie języka aplikacji, a nie na podstawie wybranego języka z formularza np. język aplikacji to pl, język z formularza to en to wtedy będzie walidowane tłumaczenie pl, a nie en. Tak było do momentu, jak użyłem podanego przeze mnie rozwiązania.

ja widzę dwa wyjścia:

pierwsze (lepsze wg mnie):

  • tworzysz FormObject dla tego formularza i tam definiujesz zmienną edit_locale czy jakkolwiek inaczej chcesz.

drugie (gorsze)

  • dodajesz do moddelu zmienną edit_locale i przekazujesz również w formularzu

A może dałoby się to obejść contextami?

Ustawiasz osobne reguły walidacji dla języka pl i en (opcja on:) i później przy zapisie save(context: params[:edit_locale])

http://blog.arkency.com/2014/04/mastering-rails-validations-contexts/ - sekcja “Where it’s fun again”