I am writing the code for a model called “ExternalDatabase”.
The model file has no code in it outside of the class declaration. I have added view pages for index, new, show, and _form .html.erb.
config/routes.rb contains the line resources :external_databases. The model contains no nested resources at this time. There are other models declared within this application, though none of them interact with this model at the moment and they are all tested and are functional and closed prior to declaring resources :external_databases.
I have a link from within the index view to new_external_database_path, which behaves exactly like {:action => "new", :controller => "external_database"} if I am following correctly.
This should theoretically load application/external_databases/new which will render _form.html.erb. The first line of _form is <%= form_for(@external_database) do |f| %>
The problem as stated in the post title occurs when using the link to /new. The url application/external_databases/new has the following error:
No route matches {:action=>"show", :controller=>"external_databases"}
When I created a data member using rails console, it was displayed properly by index and show. The same _form file is used by the edit method, and successfully edits the console-created data member. Destroy also functions.
…So why isn’t it recognizing the new method?
My controller code for this model:
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 routes.rb and Views code
My routes.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 %>
You have a typo in your new.html.erb file in your ‘back’ link. It should be:
You can compare it with your own back link in show.html.erb above.
Fixed: new.html.erb