Помощник по кнопкам отправки с I18n.t

Я хочу написать помощник для кнопки отправки, который учитывает действие (создание или обновление), чтобы получить правильный перевод. Они здесь :

fr: 
  submit:
    create:
      user: "Créer mon compte"
      product: "Déposer l'objet"
      session: "Se connecter"
    update:
      user: "Mettre à jour mon compte"
      product: "Modifier l'objet"

Я пробовал это:

def submit_button(model)
  if model == nil
    I18n.t('submit.create.%{model}')
  else
    I18n.t('submit.update.%{model}')
  end
end

Но это не сработало, и rspec отправил мне это:

Capybara::ElementNotFound: Unable to find button ...

Я знаю, что это синтаксическая проблема, но я не знаю, как это сделать...


person Flo Rahl    schedule 07.06.2013    source источник
comment
Определите doesn't work, пожалуйста )   -  person Yevgeniy Anfilofyev    schedule 07.06.2013


Ответы (3)


Для этого вам не нужен помощник, вы можете добиться этого с помощью простых рельсов. Единственное, что вам нужно, это правильно заказать I18n YAML.

fr:
  helpers:
    submit:
      # This will be the default ones, will take effect if no other
      # are specifically defined for the models.
      create: "Créer %{model}"
      update: "Modifier %{model}"

      # Those will however take effect for all the other models below
      # for which we define a specific label.
      user:
        create: "Créer mon compte"
        update: "Mettre à jour mon compte"
      product:
        create: "Déposer l'objet"
        update: "Modifier l'objet"
      session:
        create: "Se connecter"

После этого вам нужно только определить кнопку отправки следующим образом:

<%= f.submit class: 'any class you want to apply' %>

Rails возьмет метку, необходимую для кнопки.

Вы можете увидеть дополнительную информацию об этом здесь

person Fran    schedule 15.08.2013

def submit_button(model)
  if model == nil
    I18n.t("submit.create.#{model}")
  else
    I18n.t("submit.update.#{model}")
  end
end

%{} используется в файле en.yml, когда вы отправляете локальную переменную из помощника или представления.

person deepthi    schedule 07.06.2013
comment
К сожалению, когда я запускаю сервер, представление отображает кнопку translation missing: fr.submit.create.#{model}.. - person Flo Rahl; 07.06.2013
comment
Изменить ' на " в строках - person Yevgeniy Anfilofyev; 07.06.2013
comment
Попробуйте def submit_button(model) if model == nil I18n.t("#{model}", :scope => 'submit.create') else I18n.t("#{model}", :scope => 'submit.update') end end. - person deepthi; 07.06.2013
comment
Я пытался, но я все еще получаю кнопку translation missing: fr.submit.create.#{model}... - person Flo Rahl; 07.06.2013

Вам нужно имя модели, а не сам объект модели.

Попробуйте следующее:

def submit_button(model)
  model_name = model.class.name.underscore
  if model.new_record?
    I18n.t("submit.create.#{model_name}")
  else
    I18n.t("submit.update.#{model_name}")
  end
end

model не должно быть нулем в форме.

person dan    schedule 07.06.2013
comment
Но я хочу сделать уникальный помощник для каждой модели, которая у меня есть. Разве я не могу это сделать? И я думаю, что model может и есть ноль в new форме... - person Flo Rahl; 07.06.2013
comment
model не может быть nil в новой форме, как вы вызываете submit_button? Обычно в новом действии для контроллера вы создаете новую модель, которая используется в форме. С моим решением у вас есть уникальный перевод для каждой модели. Кстати, этот метод лучше называть submit_button_translation, потому что он предоставляет только перевод, а не кнопку. - person dan; 10.06.2013