Rails Routing -: action => 'new' возвращает ошибку "Не найдено ни одного маршрута {: action =>" show "... в том же контроллере - PullRequest
4 голосов
/ 15 января 2012

Я пишу код для модели с именем "ExternalDatabase".

В файле модели нет кода вне объявления класса.Я добавил страницы просмотра для index, new, show и _form .html.erb.

config / rout.rb содержит строку resources :external_databases.В данный момент модель не содержит вложенных ресурсов.В этой заявке заявлены другие модели, хотя на данный момент ни одна из них не взаимодействует с этой моделью, все они протестированы, работают и закрываются до объявления resources :external_databases.

У меня есть ссылка из представления индекса на new_external_database_path, которая ведет себя точно так же, как {:action => "new", :controller => "external_database"}, если я правильно следую.

Теоретически это должно загрузить application / external_databases / new, которое будет отображать _form.html.erb.Первая строка _form - это <%= form_for(@external_database) do |f| %>

Проблема, указанная в заголовке сообщения, возникает при использовании ссылки на / new.URL-приложение / external_databases / new имеет следующую ошибку:

No route matches {:action=>"show", :controller=>"external_databases"}

Когда я создал элемент данных с помощью rails console, он правильно отображался по индексам и шоу.Тот же файл _form используется методом edit и успешно редактирует созданный на консоли элемент данных.Уничтожить также функции.

... Так почему же он не распознает новый метод?

Код моего контроллера для этой модели:

    class ExternalDatabasesController < ApplicationController

     def index 
      @external_databases = ExternalDatabase.all

      respond_to do |format|  
       format.html # index.html.erb
       format.json { render :json => @external_databases }
      end
     end

     # POST /external_databases
     # POST /external_databases.json

     def new 
      @external_database = ExternalDatabase.new

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

     def show
      @external_database = ExternalDatabase.find(params[:id])

      respond_to do |format| 
       format.html # show.html.erb
       format.json {render :json => @external_database }
      end
     end

     def create
      @external_database = ExternalDatabase.new(params[:external_database])

      respond_to do |format|
       if @external_database.save
        format.html {redirect_to @external_database, :notice => "New External Database         Profile was created successfully!"}
        format.json {render :json => @external_database, :status => :created, :location => @external_database}
       else
        format.html {render :action => "new"}
        format.json { render :json => @external_database.errors, :status =>         :unprocessable_entity }
       end
      end
     end


     #GET /external_databases/1/edit
     def edit
      @external_database = ExternalDatabase.find(params[:id])
     end

     # PUT /external_databases/1
     # PUT /external_databases/1.json
     def update 
      @external_database = ExternalDatabase.find(params[:id])

      respond_to do |format|
       if @external_database.update_attributes(params[:external_database])
        format.html {redirect_to @external_database, :notice => "External Database         Profile was updated successfully!" }
        format.json {head :ok}
       else 
        format.html { redner :action => "edit" }
        format.json {render :json => @external_database.errors, :status =>         :unprocessable_entity }
       end
      end
     end


     # DELETE /external_databases/1
     # DELETE /external_databases/1.json
     def destroy
      @external_database = ExternalDatabase.find(params[:id])
      @external_database.destroy

      respond_to do |format| 
       format.html { redirect_to external_databases_rul }
       format.json { head :ok }
      end
     end

    end

Обновление: добавлены маршруты. Код и просмотры

Файл Мои маршруты.рб:

    App::Application.routes.draw do

      resources :type_as do 
         resources :type_bs
         end

      resources :type_bs do 
        resources :type_as
        resources :type_cs
        end

      resources :type_cs do
       resources :type_bs
       end

      resources :external_databases

      root :to => "home#index"

    end

Просмотров:

external_databases_form

    <%= form_for(@external_database) do |f| %>

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

index.html.erb

    <p id="notice"><%= notice %></p>
    <h1>External Databases</h1>

    <table border="1">
     <tr>
      <th>Database Name</th>
     </tr>
     <% @external_databases.each do |exdb| %>
      <tr>
       <td><%= exdb.name %></td>
       <td><%= truncate(exdb.description) %></td>
       <td><%= link_to 'Show', exdb %></td>
       <!-- link_to.... :target => "_blank" will open the url in a new window -->
       <td><%= link_to 'Visit', exdb.url, :target => "_blank" %></td>  
       <td><%= link_to 'Edit', edit_external_database_path(exdb)%></td>
       <td><%= link_to 'Destroy', exdb, :confirm => 'Are you sure?', :method => :delete %></td>
      </tr>
     <% end %>
    </table>

    <br/>
    <%= link_to 'New External Database Profile', { :action => "new", :controller => "external_databases" }%> | 
    <%= link_to 'Home', root_path %>

new.html.erb

    <h1>Creating a new External Database Profile</h1>

    <%= render 'form' %>

    <%= link_to 'Back', external_database_path %>

show.html.erb

    <p id="notice"><%= notice %></p>

    <table cellspacing="3" cellpadding="5" border="1">
     <tr> 
      <th><b>External Database Name</b></th>
      <th><b>Database ID</b></th>
     </tr>
     <tr>
      <td><%= @external_database.name %></td>
      <td><%= @external_database.id %></td>
     </tr>
     <tr colspan="2">
      <th><b>URL</b></th>
     </tr>
     <tr colspan="2">
      <td><%= @external_database.url %></td>
      <td><%= link_to 'Visit External Database', @external_database.url %></td>
     </tr>
    </table>



    <p>
     <h3>Description</h3>
     <!% @external_database.description.split.scan(/.{,60}/).each do |line| %>
      <!%= line %><br/>
     <!% end %>
    </p>

    <br /><br /><br />
    <%= link_to 'Back to External Database Index', external_databases_path %> |
    <%= link_to 'Edit', edit_external_database_path(@external_database) %> | 
    <%= link_to 'Destroy', :confirm => 'Are you sure?', :method => :delete %>

Ответы [ 2 ]

2 голосов
/ 17 августа 2012

У вас есть опечатка в файле new.html.erb в вашей "обратной" ссылке. Должно быть:

external_databases_path

Вы можете сравнить его со своей собственной обратной ссылкой в ​​show.html.erb выше.

Исправлено: new.html.erb

<h1>Creating a new External Database Profile</h1>

<%= render 'form' %>

<%= link_to 'Back', external_databases_path %>
0 голосов
/ 28 октября 2014

У меня была похожая проблема с этим.Следуя инструкциям здесь, не повезло.В основе моего кода form_for для отправки у меня были кнопки «Создать новый» и «Удалить».Оказывается, моя команда создания нового генерировала ошибку из-за хитрой кнопки удаления: /.В любом случае, я могу, по крайней мере, прокомментировать это, чтобы заставить работать новую кнопку, а затем сосредоточиться на отладке кнопки удаления.

  = f.submit "Submit", class: "btn btn-large btn-primary"
  = link_to 'Create New', new_matrix_header_path, class: 'btn btn-primary'
  -#= link_to 'Delete', matrix_header_path(@matrix_header), method: :delete, data: { confirm: 'Are you sure?'}, class: 'btn btn-danger'

Я просмотрел стек и обнаружил, что он начинает ошибку вокруг строки 13 моегопросмотреть строку, в которой была моя кнопка удаления.

Started GET "/matrix_headers/new" for 127.0.0.1 at 2014-10-28 21:08:48 +1000
Processing by MatrixHeadersController#new as HTML
  User Load (0.2ms)  SELECT  `users`.* FROM `users`  WHERE `users`.`id` = 1  ORDER BY `users`.`id` ASC LIMIT 1
  Rendered shared/_error_messages.html.erb (0.4ms)
  Rendered matrix_headers/_form.html.haml (21.0ms)
  Rendered matrix_headers/new.html.haml within layouts/application (22.6ms)
Completed 500 Internal Server Error in 36ms

ActionController::UrlGenerationError - No route matches {:action=>"show", :controller=>"matrix_headers", :format=>nil, :id=>#<MatrixHeader id: nil>} missing required keys: [:id]:
  actionpack (4.1.1) lib/action_dispatch/journey/formatter.rb:39:in `generate'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:597:in `generate'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:627:in `generate'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:663:in `url_for'
  actionpack (4.1.1) lib/action_dispatch/routing/url_for.rb:155:in `url_for'
  actionview (4.1.1) lib/action_view/routing_url_for.rb:83:in `url_for'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:228:in `call'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:179:in `call'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:268:in `block (2 levels) in define_url_helper'
   () media/jay/DATA/rails_projects/my_app/app/views/matrix_headers/_form.html.haml:13:in `block in _app_views_matrix_headers__form_html_haml__2669648707298145379_8667520'

Закомментировав кнопку удаления, она теперь корректно переходит к новому, не переходя к ошибке No route matches {:action=>"show".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...