Рельсы "NoMethodError" с подресурсами - PullRequest
1 голос
/ 18 апреля 2010

Я начинающий разработчик Rails, который получает следующую ошибку при попытке получить доступ к «новому» действию на моем CityController:

undefined method `cities_path' for #<#<Class:0x104608c18>:0x104606f08>
Extracted source (around line #2): 
1: <h1>New City</h1>
2: <%= form_for(@city) do |f| %>
3:   <%= f.error_messages %>
4: 
5:   <div class="field">

В качестве предыстории у меня есть модель состояния со многими городами. Я получаю эту ошибку после нажатия на следующую ссылку со страницы показа состояния:

<p>Add a city: <%= link_to "Add city", new_state_city_path(@state) %></p>

Когда я запускаю 'rake: маршруты', он говорит, что это законный маршрут ...

Для получения дополнительной информации вот новое действие CityController:

def new
@city = City.new

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @city }
end
end

Вот (полная) форма в представлении:

<%= form_for(@city) do |f| %>
<%= f.error_messages %>

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
<div class="actions">
  <%= f.submit %>
</div>
<% end %>

Изначально это заставило меня подумать, что это проблема ресурсов / маршрутов, так как она упоминалась с упоминанием 'towns_path' (на самом деле это было ошибкой другого человека, отправляющего сообщения в Stack Overflow ( Ошибка Rails "NoMethodError" - Мое первое приложение ruby ​​). Однако из того, что я вижу, это не так. Вот как выглядят мои ресурсы в моем файле маршрутов:

resources :states do
  resources :cities
end

Я могу заставить его работать, когда они не являются подресурсами, но мне действительно нужно сохранить их как подресурсы для моих будущих планов с приложением. Буду очень признателен за любую помощь, так как я ломаю себе голову над этим больше часов, чем хотел бы признаться ... Спасибо!

(Не уверен, что это вообще имеет значение, но я использую самую последнюю версию Rails 3 beta2).

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Ваша проблема связана со строкой 2 вашего представления выше, а именно с декларацией form_for. Как вы указали, state_city_path является допустимым путем, но сейчас ваша форма не использует этот путь, она использует city_path. При использовании вложенных ресурсов вам необходимо определить все с точки зрения этого вложения. Ваш form_for должен выглядеть примерно так: form_for([@state, @city]) do (точный синтаксис не помню).

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

Надеюсь, это поможет.

PS. Документация form_for довольно хороша и показывает несколько хороших примеров использования ее с ресурсами.

1 голос
/ 18 апреля 2010

Неважно - думаю, я понял это ... Мне нужно было, чтобы города определялись как ресурс сам по себе, а также подресурс государств. Теперь это похоже на работу.

1 голос
/ 18 апреля 2010

Скорее всего, проблема в этой строке:

<p>Add a city: <%= link_to "Add city", new_state_city_path(@state) %></p>

Должно быть:

<p>Add a city: <%= link_to "Add city", new_state_cities_path(@state) %></p>

Это языковой нюанс, к которому нужно привыкнуть. У меня на самом деле была такая же проблема. Пути должны быть множественными. Я также проверил бы, что ваш файл rout.rb также имеет множественную версию. Там должна быть строка, которая выглядит так:

map.resources :cities

Если у вас есть строка с надписью город вместо городов, вы должны изменить ее на город. Надеюсь это поможет. Еще один замечательный ресурс для проверки - канал #ruby irc на freenode, если у вас возникнут проблемы.

...