" show "... in the same controller I am writing code for a model c...">

Rails Routing -: action => 'new' returns the error "No route matches {: action =>" show "... in the same controller

I am writing code for a model called "ExternalDatabase".

The model file does not contain code in it outside the class declaration. I added browse pages for the index, new, show and _form.html.erb.

config / routes.rb contains the line resources :external_databases . Currently, the model does not contain embedded resources. There are other models in this application, although currently none of them interact with this model, and all of them are tested and functional and are closed until the declaration of resources :external_databases .

I have a link inside the index view to new_external_database_path , which behaves exactly like {:action => "new", :controller => "external_database"} if I follow correctly.

This theoretically loads the application / external _databases / new, which will display _form.html.erb . The first line of _form is <%= form_for(@external_database) do |f| %> <%= form_for(@external_database) do |f| %>

The problem indicated in the message header occurs when using the / new link. The url / external_databases / new application has the following error:

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

When I created the data item using the rails console , it was correctly displayed by index and displayed. The same _form file is used by the edit method and successfully edits the data element created by the console. Destroy also functions.

... So why does he not recognize the new method?

My controller code for this model is:

  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 

Update: added route.rb and view code

My route.rb file:

  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 

Views:

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 %> 
+4
source share
2 answers

You have a typo in your new.html.erb file in your backlink. It should be:

 external_databases_path 

You can compare it with your backlink in show.html.erb above.

Fixed: new.html.erb

 <h1>Creating a new External Database Profile</h1> <%= render 'form' %> <%= link_to 'Back', external_databases_path %> 
+2
source

I had a similar problem. Following the instructions here is out of luck. In the database of my form_for code for submitting, I had buttons "Create new" and "Delete". It turns out that my creation of a new one caused an error due to the ingenious delete button: /. In any case, I can at least comment on this to make the new button work, and then focus on debugging the delete button.

  = 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' 

I looked through the stack and found that it started an error around line 13 of my view, which was a line with my delete button.

 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' 

Commenting on the delete button, it now correctly moves to the new one, without switching to the error No route matches {:action=>"show" .

0
source

Source: https://habr.com/ru/post/1391038/


All Articles