2013-03-14 7 views
4

У меня есть панель управления учетной записью, в которой перечислены офисы и для каждого офиса доступны рабочие места.Rails form_for действие имеет поврежденную локаль

Иерархия:

  • компании (1 пользователь имеет 1 компанию, получить доступ, если из профиля пользователя)
  • Офисов (каждая компания может иметь несколько офисов)
  • Работы (каждый офис может иметь несколько работы)

Модели:

class Company < ActiveRecord::Base 
    has_many :offices, :dependent => :destroy 
    has_many :jobs, :through => :offices 

class Office < ActiveRecord::Base 
    belongs_to :company 
    has_many :jobs, :dependent => :destroy 

class Job < ActiveRecord::Base 
    belongs_to :office 

Для каждой работы у меня есть ссылка для редактирования

E.g. для работы ид 10 (работа является локальной переменной от итерации на офисных рабочих мест)

= link_to edit_job_path (I18n.locale, работа)

-> локальный: 3000/де/работы/10/редактировать

Когда я нажимаю на ссылку редактирования, я перехожу на страницу редактирования. До сих пор так хорошо, но форма выглядит следующим образом:

<form accept-charset="UTF-8" action="/10/jobs/10" class="edit_job" enctype="multipart/form-data" id="edit_job_10" method="post"> 

Обратите внимание, что мой локали (де в этом примере) исчезает и имеет идентификатор задания, а!

Мой routes.rb

scope "/:locale" do 
    resources :companies 
    resources :offices do 
      resources :jobs 
    end 
    resources :jobs 
end 

Есть два рабочих места, упомянутые, я, вероятно, может обойтись без, но это простой способ для меня, чтобы либо упомянуть непосредственно в URL задания для просмотра или добавить переменную офиса в создании новых ссылка на работу и использование: office_id (в моем контроллере панели управления: link_to new_office_job_path (I18n.locale, office), то в моей форме для новых рабочих мест: = f.hidden_field: office_id)

Но даже если я удалю ресурсы: задания в : офисы. Локаль по-прежнему заменяется идентификатором задания в форме редактирования.

Обратите внимание, что я могу правильно отредактировать задание, но поскольку локаль изменена, текст локализации ошибочен после моего перенаправления.

Любая идея, как исправить это?

------ Дополнительные данные запрошенный -----------

= form_for(@job) do |f| 
    .field 
     = f.label :name, t(:job_title) 
     = f.text_field :name 
    .field 
     = f.label :url, t(:job_url) 
     = f.text_field :url 
    .field 
     = f.hidden_field :office_id 
    .field 
     = f.label :pdf, t(:job_upload_pdf) 
     = f.file_field :pdf 
    .field 
     = f.label :tag_list, t(:job_tags) 
     = f.text_field :tag_list 
    .actions 
     = f.submit "Submit", :class => "btn btn-primary" 

------ Дополнительная информация -----------

BTW: эта работа работает, я получаю/de/jobs/10, но я хотел бы понять, почему локаль повреждена, если я использую форму по умолчанию form_for.

= form_for @job, :url => job_path(I18n.locale, @job) do |f| 
+0

Ваша проблема, скорее всего, в самой форме. можете ли вы включить код для формы редактирования в свой вопрос? – jvnill

+0

Форма очень похожа на форму «новая работа», которая не затрагивает языковой стандарт. ссылка на новое: localhost: 3000/de/office/5/jobs/new (используя другой ресурс в пути) -> form accept-charset = "UTF-8" action = "/ de/jobs" class = "new_job" enctype = "multipart/form-data" id = "new_job" method = "post" – Jeremy

+0

Запуск 'url_for (@job)' дает мне ошибку, которая меня озадачивает, почему вы ее не получаете. я смог исправить это, передав параметр «как» в область на маршрутах и ​​используя сгенерированный named_route. что-то вроде 'locale_job_path (params [: locale], @job)'. – jvnill

ответ

0

Вы можете обрабатывать локаль с помощью Routing Filter, я попробовал это в моем проекте, вам не придется беспокоиться о локализации в маршрутах, фильтр будет обрабатывать его для вас.

# in config/routes.rb 
Rails.application.routes.draw do 
    filter :locale 
end 

Я надеюсь, что это решит вашу проблему.

+0

Привет, Саймон, я доволен своими маршрутами так, как они есть. Вопрос в том, почему локальный использует идентификатор задания вместо локали, когда другие формы (например, новое задание) работают нормально. – Jeremy

0

Строка form_for строит путь, при построении пути вам также необходимо указать локаль. Для того, чтобы сделать это чисто (без указания URL в явном виде, что также возможно), записать его следующим образом:

= form_for [I18n.locale, @job] do |f| 

и что должно оказывать правильный путь. Как указано в documentation, он будет использовать массив для построения правильного пути (это работает для имен и вложенных маршрутов, поэтому я предполагаю, что он также будет работать для вашей локали).

Альтернативой является указание пути явно, используя опцию :url.

HTH.

+0

Ну, этот ответ - это то, что я уже сказал в конце. Вопрос в том, почему локальный путь поврежден в первую очередь, а другой form_for хорош (как для нового). – Jeremy

+0

Вы пробовали форму 'form_for [I18n.locale, @job]'? Вы уверены, что установлен «I18n.locale»? Мы используем 'before_filter' в контроллере приложения, который всегда устанавливает локаль на основе параметров« params [: locale] », cookie или пользователя (в этом порядке). – nathanvda

+0

Я получил это в контроллере приложений. Вот почему я озадачен. \t before_filter: set_locale \t \t Защиту set_locale \t I18n.locale = Params [: региональные] || I18n.default_locale \t end И locale правильно присутствует и в параметрах. – Jeremy