Статьи

Простая интернационализация для вашего Rails-приложения с BDD, часть III

Редактирование местоположения.

В первой части мы создали приложение, в котором перечислены местоположения на английском и испанском языках. Во второй части мы добавили возможность создавать новые локации на английском и испанском языках.

В этой части мы отредактируем местоположение, показывая пути локализации. Помните, что мы используем Cucumber и BDD для запуска нашего приложения.

Давайте напишем сценарий для этого.

Scenario: Edit a location
Given there is a location named «location 1»
And I am on the en site
When I Update the location Name to «location has changed»
Then I should see «location has changed»

Прежде чем мы сделаем это, давайте сделаем шаг назад. В конце второй части мы реорганизовали наши сценарии в наброски сценариев. Подобный сценарий мы напишем позже, чтобы сохранить рефакторинг. Мы также будем использовать тег @wip, поэтому сейчас мы можем сосредоточиться на этом тесте.

@wip
Scenario Outline: Edit a location
Given I am on the <language> site
And there is a location named «<location>»
When I «<action>» the location «<field>» to «<new_name>»
Then I should see «<new_name>»
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |

Пример таблицы содержит параметры для наших сценариев. Параметры — это язык, имя исходного местоположения, действие, которое нужно выполнить, и метка для поля имени. Последний параметр указывает сообщение, отображаемое после завершения действия.

Давайте добавим это в наш файл /features/managing_locations.feature. Запустите Огурец и посмотрите, что получится.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/managing_locations.feature:34
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
1 scenario (1 undefined)
4 steps (1 skipped, 1 undefined, 2 passed)
0m1.289s
You can implement step definitions for undefined steps with these snippets:
When /^I «([^«]*)« the location «([^«]*)« to «([^«]*)«$/ do |arg1, arg2, arg3|
pending # express the regexp above with the code you wish you had
end
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Не так уж плохо. Пара шагов уже пройдена. Огурец говорит нам, что делать дальше. Как бы вы «обновили» местоположение «Имя» до «Новое имя»?

Как насчет?
+ Перейти на страницу местоположения.
+ Нажмите на ссылку для редактирования.
+ Заполните поле имени нашим новым названием местоположения.
+ Нажмите кнопку обновления.

Звучит хорошо, давайте напишем эти шаги.

Откройте up / features / step определений / location steps.rb и добавьте эти шаги.

When /^I «([^»]*)» the location «([^«]*)» to «([^»]*)«$/ do |button, field, value|
visit(location_path(Location.first, :locale => I18n.locale.to_s))
click_link «Edit«
fill_in(field, :with => value)
click_button(button)
end

Имеет ли это смысл?

Поскольку мы создали местоположение на более раннем этапе, мы получаем первое местоположение. Мы также передаем язык. Это сделает следующий маршрут «/ en / location / 1». Благодаря Capybara будет нажата ссылка «Изменить». Форма будет заполнена. И кнопка отправки будет нажата.

Думаешь, это сработает? Запустим огурец.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
no link with title, id or text Edit found (Capybara::ElementNotFound)
(eval):2:in `click_link
./features/step_definitions/location_steps.rb:35:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m2.123s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Все в порядке. Огурец руководит следующей задачей: добавление ссылки редактирования на странице шоу. Откройте /app/views/locations/show.html.erb

<p><%= link_to «Edit», edit_location_path(@location) %></p>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Бросить кости.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
undefined method `edit_location_path for #<#<Class:0xb4954c>:0xb1bde0> (ActionView::Template::Error)
./app/views/locations/show.html.erb:2:in `_app_views_locations_show_html_erb___614471579_8136790
./features/step_definitions/location_steps.rb:34:in `/^I «([^«]*)« the location «([^«]*)« to «([^«]*)«$/’
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m2.041s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Нам нужно определить маршрут edit_location. Мы можем это сделать. Откройте /config/routes.rb и, над корневым маршрутом, добавьте

Это должно сделать это. Огурец, давай рвем.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
The action edit could not be found for LocationsController (AbstractController::ActionNotFound)
(eval):2:in `click_link
./features/step_definitions/location_steps.rb:35:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m2.255s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

А? Нам нужно добавить действие редактирования в контроллере локаций. Откройте файл контроллера местоположения и добавьте это действие

# GET /locations/1/edit
def edit
@location = Location.find(params[:id])
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Второй стих, такой же, как первый. Перезапустите тест.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
Missing template locations/edit, application/edit with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
* «/Users/johnivanoff/Sites/international/app/views«
(ActionView::MissingTemplate)
/Users/johnivanoff/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/benchmark.rb:309:in `realtime
(eval):2:in `click_link
./features/step_definitions/location_steps.rb:35:in `/^I «([^«]*)« the location «([^«]*)« to «([^«]*)«$/’
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m2.088s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Нам нужна страница редактирования. Поскольку наша страница редактирования и новая страница совпадают, мы объединяем их, используя партиалы. Сделайте страницу формы, а затем включите это частичное в новые и редактировать страницы. Извлеките форму из файла new.html.erb и вставьте ее в /app/views/locations/_form.html.erb

_form.html.erb

<%= form_for(@location) do |f| %>
<p>
<%= f.label :name, t(‘.name_html’) %>
<%= f.text_field :name %>
</p>
<p>
<%= f.button t(‘.button_html’) %>
</p>
<% end %>

view raw
gistfile1.rb
hosted with ❤ by GitHub

В new.html.erb вызовите эту форму частичной.

new.html.erb

<%= render ‘form’ %>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Страница редактирования выглядит очень похоже …

edit.html.erb

<%= render ‘form’ %>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Давайте запустим тест и посмотрим, какой урон мы нанесли.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
no button with value or id or text Update found (Capybara::ElementNotFound)
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:37:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m2.343s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Мы не видим кнопку обновления.

Согласно файлу en.yml на кнопке будет написано «Создать». Если мы изменим это на Update, то тест для Create не будет выполнен. В исходной форме было только <% = f.submit%> для кнопки, и она знала, когда сказать «Создать» или «Обновить». Давайте углубимся в исходный код rails и посмотрим, как это работает.

Проверьте помощники формы для вида действия в строке 1064, где объясняется, как это работает. И, OMG, они говорят нам, что делать при использовании i18n. Чертовски круто!

# Those labels can be customized using I18n, under the helpers.submit key and accept
# the %{model} as translation interpolation:
#
# en:
# helpers:
# submit:
# create: «Create a %{model}»
# update: «Confirm changes to %{model}»

view raw
gistfile1.rb
hosted with ❤ by GitHub

Теперь обновите файл en.yml, чтобы отразить это.

en:
helpers:
submit:
create: «Create %{model}«
update: «Update %{model}«
locations:
index:
title_html: «Locations«
new:
name_html: «Name«

view raw
gistfile1.yml
hosted with ❤ by GitHub

Запустите тест.
ПОДОЖДИТЕ! Посмотри, что мы сделали. У нас больше нет файла .button_html в файле en.yml. Теперь мы говорим, что помощник для отправки скажет либо «Создать для публикации», либо «Обновление». При этом нам нужно изменить кнопку в форме обратно на подход по умолчанию.

<%= form_for(@location) do |f| %>
<p>
<%= f.label :name, t(‘.name_html’) %>
<%= f.text_field :name %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Это чувствует себя чище.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
expected there to be content «location has changed« in «International\n\nlocation 1\nEdit\n\n« (RSpec::Expectations::ExpectationNotMetError)
./features/step_definitions/location_steps.rb:15:in `/^(?:|I )should see «([^«]*)«$/’
features/managing_locations.feature:35:in `Then I should see «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 3 passed)
0m2.175s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

_expected there to be content "location has changed" in "Internationalnnlocation 1nEditnn"_ Ожидается, что _expected there to be content "location has changed" in "Internationalnnlocation 1nEditnn"_ HMMM… это кажется неправильным. Почему все еще говорится местоположение 1 ? Давайте посмотрим на файл журнала испытаний.

Откройте /log/test.log и посмотрите последние несколько строк.

[1m[36m (0.1ms)[0m [1mbegin transaction[0m
[1m[35m (0.1ms)[0m SAVEPOINT active_record_1
[1m[36mSQL (40.8ms)[0m [1mINSERT INTO «locations» («created_at», «name», «updated_at») VALUES (?, ?, ?)[0m [[«created_at», Wed, 07 Mar 2012 20:29:52 UTC +00:00], [«name», «location 1»], [«updated_at», Wed, 07 Mar 2012 20:29:52 UTC +00:00]]
[1m[35m (0.1ms)[0m RELEASE SAVEPOINT active_record_1
[1m[36mLocation Load (0.2ms)[0m [1mSELECT «locations».* FROM «locations» LIMIT 1[0m
Started GET «/en/locations/1» for 127.0.0.1 at 2012-03-07 14:29:52 -0600
Processing by LocationsController#show as HTML
Parameters: {«locale»=>»en», «id»=>»1»}
[1m[35mLocation Load (0.2ms)[0m SELECT «locations».* FROM «locations» WHERE «locations».»id» = ? LIMIT 1 [[«id», «1»]]
Rendered locations/show.html.erb within layouts/application (42.5ms)
Completed 200 OK in 207ms (Views: 201.2ms | ActiveRecord: 0.2ms)
Started GET «/en/locations/1/edit» for 127.0.0.1 at 2012-03-07 14:29:53 -0600
Processing by LocationsController#edit as HTML
Parameters: {«locale»=>»en», «id»=>»1»}
[1m[36mLocation Load (0.1ms)[0m [1mSELECT «locations».* FROM «locations» WHERE «locations».»id» = ? LIMIT 1[0m [[«id», «1»]]
Rendered locations/_form.html.erb (4.7ms)
Rendered locations/edit.html.erb within layouts/application (30.1ms)
Completed 200 OK in 35ms (Views: 33.0ms | ActiveRecord: 0.1ms)
Started PUT «/en/locations/1» for 127.0.0.1 at 2012-03-07 14:29:53 -0600
Processing by LocationsController#show as HTML
Parameters: {«utf8″=>»✓», «location»=>{«name»=>»location has changed»}, «commit»=>»Update Location», «locale»=>»en», «id»=>»1»}
[1m[35mLocation Load (0.1ms)[0m SELECT «locations».* FROM «locations» WHERE «locations».»id» = ? LIMIT 1 [[«id», «1»]]
Rendered locations/show.html.erb within layouts/application (0.7ms)
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 0.1ms)
[1m[36m (0.9ms)[0m [1mrollback transaction[0m

view raw
gistfile1.txt
hosted with ❤ by GitHub

После действия редактирования он направляется к действию шоу. Проблема с маршрутизацией! Если вы посмотрите на последний запрос, запустили PUT «/ en / location / 1» для 127.0.0.1 . Он использует глагол PUT для обозначения действия обновления. У нас есть маршрут для / location /: id, и он идет к действию шоу. Поскольку этот маршрут может использовать любой глагол, GET, PUT или что-либо еще, этот маршрут должен реагировать только на GET. Затем нам нужно создать маршрут для действия обновления, которое отвечает только на PUT.
Давайте откроем файл маршрутов.

match «locations/(:id)» => ‘locations#show’, :as => :location, :via => [:get]
match «locations/(:id)» => ‘locations#update’, :as => :location, :via => [:put]

view raw
gistfile1.rb
hosted with ❤ by GitHub

Любые ставки? Это пройдет? Раскатать кубики огурца.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
The action update could not be found for LocationsController (AbstractController::ActionNotFound)
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:37:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m2.312s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Вот и мы. Я ожидал эту ошибку. Давайте добавим действие обновления в контроллер.

# PUT /locations/1
# PUT /locations/1.json
def update
@location = Location.find(params[:id])
respond_to do |format|
if @location.update_attributes(params[:location])
format.html { redirect_to @location, notice: ‘Location was successfully updated.’ }
format.json { head :ok }
else
format.html { render action: «edit» }
format.json { render json: @location.errors, status: :unprocessable_entity }
end
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Вы знаете, что делать дальше … перезапустите тест.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
1 scenario (1 passed)
4 steps (4 passed)
0m2.357s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |

view raw
gistfile1.sh
hosted with ❤ by GitHub

Перерыв!

Внедрение La Prueba Испанский

Давайте добавим испанскую часть сценария. Добавьте следующий конец в конец таблицы примеров.

| es | location 1 | Actualizar | Nombre | location has changed |

Думаешь, все будет зеленым?

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
| es | location 1 | Actualizar | Nombre | location has changed |
cannot fill in, no text field, text area or password field with id, name, or label Nombre found (Capybara::ElementNotFound)
(eval):2:in `fill_in
./features/step_definitions/location_steps.rb:36:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
2 scenarios (1 failed, 1 passed)
8 steps (1 failed, 1 skipped, 6 passed)
0m2.508s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |

view raw
gistfile1.sh
hosted with ❤ by GitHub

Хорошо, это знакомо. нам нужно изменить файл es.yml, как мы делали файл en.yml. Откройте файл испанской локали.

Перезапустите тест. Идите зеленый!

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
| es | location 1 | Actualizar | Nombre | location has changed |
cannot fill in, no text field, text area or password field with id, name, or label Nombre found (Capybara::ElementNotFound)
(eval):2:in `fill_in
./features/step_definitions/location_steps.rb:36:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«
Failing Scenarios:
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location
2 scenarios (1 failed, 1 passed)
8 steps (1 failed, 1 skipped, 6 passed)
0m2.222s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |

view raw
gistfile1.sh
hosted with ❤ by GitHub

Странно, что работало в английской версии. Если мы запустим сервер rails и перейдем на страницу редактирования местоположения, то увидим, что в поле имени указано Name Html для английского и испанского языков. Что произошло? Давайте немного поразмышляем … Когда мы переместили форму из файла new.html.erb и поместили ее в файл _form.html.erb, мы не отразили это изменение в наших файлах локали. Давайте внесем это изменение в оба файла локали.

Прежде чем мы проведем тест снова, вы понимаете, почему тест по английскому языку прошел? Если вы сказали, что прошло, потому что «имя» на этикетке, вы правы. Раскланиваться.

Третий стих, такой же, как первый

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario Outline: Edit a location # features/managing_locations.feature:31
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
| es | location 1 | Actualizar | Nombre | location has changed |
2 scenarios (2 passed)
8 steps (8 passed)
0m2.528s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |
features/managing_locations.feature:40:in `| es | location 1 | Actualizar | Nombre | location has changed |

view raw
gistfile1.sh
hosted with ❤ by GitHub

Прежде чем мы наберем пять, удалите тег wip из теста и запустите cucumber для запуска всех тестов.

$ cucumber
Using the default profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
Scenario Outline: List locations # features/managing_locations.feature:6
Given there is a location named «<location>« # features/step_definitions/location_steps.rb:1
And I am on the <language> site # features/step_definitions/location_steps.rb:5
When I am on the locations page # features/step_definitions/location_steps.rb:9
Then I should see «<title>« # features/step_definitions/location_steps.rb:13
And I should see «<location>« # features/step_definitions/location_steps.rb:13
Examples:
| location | language | title |
| location 1 | en | Locations |
| location 2 | es | Locaciones |
Scenario Outline: : Create a new location # features/managing_locations.feature:18
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And I am on new location page # features/step_definitions/location_steps.rb:21
And I fill in «<name>« with «<location>« # features/step_definitions/location_steps.rb:25
And press «<button>« # features/step_definitions/location_steps.rb:29
Then I should see «<location>« # features/step_definitions/location_steps.rb:13
Examples:
| language | name | location | button |
| en | Name | location 1 | Create |
| es | Nombre | location 1 | crear |
Scenario Outline: Edit a location # features/managing_locations.feature:30
Given I am on the <language> site # features/step_definitions/location_steps.rb:5
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13
Examples:
| language | location | action | field | new_name |
| en | location 1 | Update | Name | location has changed |
| es | location 1 | Actualizar | Nombre | location has changed |
6 scenarios (6 passed)
28 steps (28 passed)
0m5.281s

view raw
gistfile1.sh
hosted with ❤ by GitHub

… и занавес.

В этой части мы копались в исходном коде рельсов. Это было не так страшно. Мы просмотрели файлы журналов, чтобы понять, что происходит. Они полны ценной информации.

Теперь все, что нам нужно сделать, это удалить местоположение, и у нас будет простое интернационализированное веб-приложение.

До тех пор.