Не найдено ни одного маршрута с вложенными ресурсами - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть две связанные таблицы.Venues и Specials.A venue может иметь много specials.После того, как пользователь создал место, я хочу разрешить ему создать специальную страницу на странице venues#index.Используя вложенные ресурсы, я достиг желаемого URL: /venues/5/specials/new.

Однако мой текущий код показывает: No route matches {:controller=>"specials", :format=>nil}

Я предполагаю, что ошибка связана с моими функциями SpecialsController и def new и def create.Я хотел бы, чтобы URL перенес меня на страницу формы, где я мог бы вводить новые данные для спец.

<%= link_to 'Add Special', new_venue_special_path(venue) %>



App1::Application.routes.draw do

  resources :venues do 
    resources :specials
end


def new
    @venue = Venue.find(params[:venue_id])
      @special = @venue.specials.build
        respond_to do |format|
        format.html # new.html.erb
        format.json { render json: @special }
       end
      end


  def create
    @venue = Venue.find(params[:venue_id])
    @special = @venue.specials.build(params[:special])


    respond_to do |format|
      if @special.save
        format.html { redirect_to @special, notice: 'Special was successfully created.' }
        format.json { render json: @special, status: :created, location: @special }
      else
        format.html { render action: "new" }
        format.json { render json: @special.errors, status: :unprocessable_entity }
      end
    end
  end

Backtrace

Started GET "/venues/4/specials/new" for 127.0.0.1 at 2011-12-06 23:36:01 +0200
  Processing by SpecialsController#new as HTML
  Parameters: {"venue_id"=>"4"}
  [1m[36mVenue Load (0.2ms)[0m  [1mSELECT "venues".* FROM "venues" WHERE "venues"."id" = $1 LIMIT 1[0m  [["id", "4"]]
Rendered specials/_form.html.erb (1.9ms)
Rendered specials/new.html.erb within layouts/application (2.6ms)
Completed 500 Internal Server Error in 97ms

ActionView::Template::Error (No route matches {:controller=>"specials", :format=>nil}):
    1: <%= form_for(@special) do |f| %>
    2:   <% if @special.errors.any? %>
    3:     <div id="error_explanation">
    4:       <h2><%= pluralize(@special.errors.count, "error") %> prohibited this special from being saved:</h2>
  app/views/specials/_form.html.erb:1:in `_app_views_specials__form_html_erb__2784079234875518470_70162904892440'
  app/views/specials/new.html.erb:7:in `_app_views_specials_new_html_erb__115378566176177893_70162906293160'
  app/controllers/specials_controller.rb:30:in `new'

Rendered /Users/andrewlynch/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.7ms)

1 Ответ

2 голосов
/ 07 декабря 2011
redirect_to @special

по умолчанию это "specials_path", но вы используете venue_special_path

Вы, вероятно, хотите:

redirect_to [@venue, @special]

и в форме вам понадобится тоже самое:

<%= form_for([@venue, @special]) do |f| %>

в основном - проблема в том, что у вас есть вложенный ресурс ... это означает, что каждое место, где вы объявляете путь URL (включая неявные места, такие как form_for), должно быть заменено как @venue и @special, а не просто @ special.

вы можете столкнуться с той же «ошибкой» в другом месте вашего сгенерированного кода скаффолда ... просто сделайте то же самое, и вы должны быть хорошими.

...