I'm new to Rails and am working towards creating a hyper link in 'views/admins/show.html.erb' that loads 'views/residents/new.html.erb'. In the name of clarity 'views/admins/show.html.erb' and 'views/residents/new.html.erb' are from separate controllers. I am stumped on finding solutions to my routing failures, and am generating the following message:
NameError in Admins#show
Showing /Users/beracus/rails_projects/whizcharts/app/views/admins/show.html.erb where line #11 raised:
undefined local variable or method `residents_new' for
<#:0x000001019a2228> Extracted source (around line #11):
11: <%= link_to 'create a new resident', residents_new %>
I would like to figure out how to successfully create a hyper-link in Rails that enables me to link to other views/partials whether or not they are from the same controller. Also I would like to better understand what my error message means to help prevent this in the future. Any guidance to documentation is appreciated, as well as pointing out any design rules I may be violating. I've searched for and found similar challenges posed to others, but due to my inexperience, I've not yet been able to cater those solutions to my needs.
I have tried the following.
- Ruby on Rails guide
- The low down on routes in Rails 3
- Rails 3 render action from another controller
- undefined method `companies_path' error
- ruby rails - undefined local variable or method `new_user_session_path'
Here's my code:
# config/routes.rb
Sample::Application.routes.draw do
resources :admins do
resources :residents
end
resources :sessions, only: [:new, :create, :destroy]
root to: 'static_pages#home'
match '/signup', to: 'admins#new'
match '/signin', to: 'sessions#new'
match '/signout', to: 'sessions#destroy', via: :delete
match '/help', to: 'static_pages#help'
match '/about', to: 'static_pages#about'
match '/contact', to: 'static_pages#contact'
.
.
.
match ':controller(/:action(/:id))(.:format)'
end
# controllers/admins_controller.rb
class AdminsController < ApplicationController
before_filter :signed_in_admin, only: [:index, :edit, :update]
before_filter :correct_admin, only: [:edit, :update]
before_filter :super_admin, only: :destroy
def index
@admins = Admin.paginate(page: params[:page])
end
def show
@admin = Admin.find(params[:id])
end
def new
@admin = Admin.new
end
def create
@admin = Admin.new(params[:admin])
if @admin.save
sign_in @admin
flash[:success] = "Welcome to Whizcharts!"
redirect_to @admin
else
render 'new'
end
end
def edit
@admin = Admin.find(params[:id])
end
def update
@admin = Admin.find(params[:id])
if @admin.update_attributes(params[:admin])
flash[:success] = "Profile updated"
sign_in @admin
redirect_to @admin
else
render 'edit'
end
end
def destroy
Admin.find(params[:id]).destroy
flash[:success] = "User deleted."
redirect_to admins_path
end
private
def signed_in_admin
unless signed_in?
store_location
redirect_to signin_path, notice: "Please sign in."
end
def correct_admin
@admin = Admin.find(params[:id])
redirect_to(root_path) unless current_admin?(@admin)
end
def super_admin
redirect_to(root_path) unless current_admin.super?
end
end
end
# controllers/residents_controller.rb
class ResidentsController < ApplicationController
def index
@residents = Resident.paginate(page: params[:page])
end
def show
@resident = Resident.find(params[:id])
end
def new
@resident = Resident.new
end
def create
@resident = Resident.new(params[:resident])
end
def edit
@resident = Resident.find(params[:id])
end
def update
@resdient = Resident.find(params[:id])
if @resident.update_attributes(params{:resident})
flash[:success] = "Resident's profile updated"
sign_in @resident
redirect_to @resident
else
render 'edit'
end
end
def destroy
Resident.find(params[:id]).destroy
flash[:success] = "Resident deleted"
redirect_to residents_path
end
def _form
@residents = Resident.paginate(page: params[:page])
end
end
# views/admins/show.html.erb
<% provide(:title, @admin.fname + " " + @admin.lname) %>
<div class="row">
<aside class="span4">
<section>
<h1>
<%= gravatar_for @admin %>
<%= @admin.fname + " " + @admin.lname %>
</h1>
</section>
<section class="resident">
<%= link_to 'create a new resident', residents_new %>
</section>
</aside>
</div>
# views/residents/new.html.erb
<% provide(:title, @admin.fname + " " + @admin.lname) %>
<div class="row">
<aside class="span4">
<section>
<h1>
<%= gravatar_for @admin %>
<%= @admin.fname + " " + @admin.lname %>
</h1>
</section>
<section class="resident">
<%= link_to 'create a new resident', residents_new %>
</section>
</aside>
</div>
# views/residents/form.html.erb
<%= form_for(@resident) do |f| %>
<% if @resident.error.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@resident.errors.count, "error") %>
prohibited this resident from being saved:
</h2>
<ul>
<% @resident.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :fname %><br />
<%= f.text_field :fname %>
</div>
<div class="field">
<%= f.label :lname %><br />
<%= f.text_field :lname %>
</div>
<div class="field">
<%= f.label :dob %><br />
<%= f.text_field :dob %>
</div>
<div class="field">
<%= f.radio_button :gender, 'Male' %>
<%= f.label "gender", "Male" %>
<br />
<%= f.radio_button :gender, 'Female' %>
<%= f.label "gender", "Female" %>
<br />
<%= f.radio_button :gender, 'Other' %>
<%= f.label "gender", "Other" %>
<br />
</div>
<div class="field">
<%= f.label :soc %><br />
<%= f.text_field :soc %><br />
</div>
<div class="field">
<%= f.label :address %><br />
<%= f.text_field :address %>
</div>
<div class="field">
<%= f.label :city %><br />
<%= f.text_field :city %>
</div>
<div class="field">
<%= f.label :state %><br />
<%= f.text_field :state %>
</div>
<div class="field">
<%= f.label :zip %><br />
<%= f.text_field :zip %>
</div>
<div class="field">
<%= f.label :phone %><br />
<%= f.text_field :phone %>
</div>
<div class="field">
<%= f.label :doc_fname %><br />
<%= f.text_field :doc_fname %>
</div>
<div class="field">
<%= f.label :doc_lname %><br />
<%= f.text_field :doc_lname %>
</div>
<div class="field">
<%= f.label :doc_phone1 %><br />
<%= f.text_field :doc_phone1 %>
</div>
<div class="field">
<%= f.label :doc_phone2 %><br />
<%= f.text_field :doc_phone2 %>
</div>
<div class="field">
<%= f.label :doc_fax %><br />
<%= f.text_field :doc_fax %>
</div>
<div class="field">
<%= f.label :doc_email %><br />
<%= f.text_field :doc_email %>
</div>
<div class="field">
<%= f.label :guard_fname %><br />
<%= f.text_field :guard_fname %>
</div>
<div class="field">
<%= f.label :guard_lname %><br />
<%= f.text_field :guard_lname %>
</div>
<div class="field">
<%= f.label :guard_address %><br />
<%= f.text_field :guard_address %>
</div>
<div class="field">
<%= f.label :guard_city %><br />
<%= f.text_field :guard_city %>
</div>
<div class="field">
<%= f.label :guard_state %><br />
<%= f.text_field :guard_state %>
</div>
<div class="field">
<%= f.label :guard_zip %><br />
<%= f.text_field :guard_zip %><br />
</div>
<div class="field">
<%= f.label :guard_phone1 %><br />
<%= f.text_field :guard_phone1 %>
</div>
<div class="field">
<%= f.label :guard_phone2 %><br />
<%= f.text_field :guard_phone2 %>
</div>
<div class="field">
<%= f.label :guard_email %><br />
<%= f.text_field :guard_email %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
# rake routes
Mac-Pro:whizcharts beracus$ rake routes
admin_residents GET /admins/:admin_id/residents(.:format) residents#index
POST /admins/:admin_id/residents(.:format) residents#create
new_admin_resident GET /admins/:admin_id/residents/new(.:format) residents#new
edit_admin_resident GET /admins/:admin_id/residents/:id/edit(.:format) residents#edit
admin_resident GET /admins/:admin_id/residents/:id(.:format) residents#show
PUT /admins/:admin_id/residents/:id(.:format) residents#update
DELETE /admins/:admin_id/residents/:id(.:format) residents#destroy
admins GET /admins(.:format) admins#index
POST /admins(.:format) admins#create
new_admin GET /admins/new(.:format) admins#new
edit_admin GET /admins/:id/edit(.:format) admins#edit
admin GET /admins/:id(.:format) admins#show
PUT /admins/:id(.:format) admins#update
DELETE /admins/:id(.:format) admins#destroy
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
root / static_pages#home
signup /signup(.:format) admins#new
signin /signin(.:format) sessions#new
signout DELETE /signout(.:format) sessions#destroy
help /help(.:format) static_pages#help
about /about(.:format) static_pages#about
contact /contact(.:format) static_pages#contact
/admin(.:format) admins#index
show /show(.:format) admins#show
new /new(.:format) admins#new
create /create(.:format) admins#create
edit /edit(.:format) admins#edit
update /update(.:format) admins#update
destroy /destroy(.:format) admins#destroy
residents /residents(.:format) residents#path
form /form(.:format) residents#form
/create(.:format) residents#create
/destroy(.:format) residents#destroy
/edit(.:format) residents#edit
index /index(.:format) residents#index
/new(.:format) residents#new
/show(.:format) residents#show
/update(.:format) residents#update
/:controller(/:action(/:id))(.:format) :controller#:action