routing issue passing id rails 4 - ruby-on-rails-4

Firstly apologies as just when i think i have a grip on routing i find that i don't!!
When a registered user logs in to my app they are taken to the admin index view and all i am trying to do is display their user name within that view.
This is my routes config: -
Easygifts::Application.routes.draw do
get 'admin' => 'admin#index'
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end
get "sessions/create"
get "sessions/destroy"
resources :users
resources :admin
resources :stores do
collection do
get "writing"
get "office"
get "time"
get "home"
get "wellness"
get "travel"
get "bags"
get "leisure"
get "contact"
get "terms"
end
member do
get 'quote'
end
end
resources :products
Users login via the sessions controller and are passed on to the Admin controllers index view. Where i am trying to display their name using the following: - <th colspan="2">Welcome <%= #users.name %></th>
The Sessions controller: -
class SessionsController < ApplicationController
skip_before_action :authorize
def new
end
def create
user = User.find_by(name: params[:name])
if user and user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to admin_url
else
redirect_to login_url, alert: "Invalid user/password combination"
end
end
def destroy
session[:user_id] = nil
redirect_to stores_url, notice: "Logged out"
end
end
The Users Controller: -
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
# GET /users
# GET /users.json
def index
#users = User.order(:name)
end
# GET /users/1
# GET /users/1.json
def show
end
# GET /users/new
def new
#user = User.new
end
# GET /users/1/edit
def edit
end
# POST /users
# POST /users.json
def create
#user = User.new(user_params)
respond_to do |format|
if #user.save
format.html { redirect_to users_url, notice: "User #{#user.name} was successfully created." }
format.json { render action: 'show', status: :created, location: #user }
else
format.html { render action: 'new' }
format.json { render json: #user.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /users/1
# PATCH/PUT /users/1.json
def update
respond_to do |format|
if #user.update(user_params)
format.html { redirect_to users_url, notice: "User #{#user.name} was successfully updated." }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: #user.errors, status: :unprocessable_entity }
end
end
end
# DELETE /users/1
# DELETE /users/1.json
def destroy
begin
#user.destroy
flash[:notice] = "User #{#user.name} deleted"
rescue StandardError => e
flash[:notice] = e.message
end
respond_to do |format|
format.html { redirect_to users_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_user
#user = User.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:name, :password, :password_confirmation, :add1, :add2, :add3, :add4, :post_code, :home_tel, :mobile, :ice_tel, :ni_number, :position, :image_url, :staff_num, :start_date, :birthday)
end
end
And the Admin Controller: -
class AdminController < ApplicationController
def index
#users = User.find(params[:id])
end
end
My first point of confusion is whether i should be going through the Sessions controller or the Users controller?
If it's in the Sessions controller am i supposed to write something like get 'admin#index' => :show
Or if it's in Users am i to write something like resources :users do member do get 'admin' end end
I think i have to define a controller with an action within my routes but i don't understand in this instance how to work out who is doing what.

Related

Problems with nested form Rails

I am trying to save in 2 tables in the same time, using nested form. I do not know why this is not happening. Rails error says "1 error prohibited this person from being saved:" Why the Legal Person is not getting the Person_id?
Models
class Person < ApplicationRecord
has_one :legal_person, dependent: :destroy
accepts_nested_attributes_for :legal_person
end
class LegalPerson < ApplicationRecord
belongs_to :person
end
Controller
class PeopleController < ApplicationController
before_action :set_person, only: [:show, :edit, :update, :destroy]
# GET /people
# GET /people.json
def index
#people = Person.all
end
# GET /people/1
# GET /people/1.json
def show
end
# GET /people/new
def new
#person = Person.new
#person.build_legal_person
end
# GET /people/1/edit
def edit
end
# POST /people
# POST /people.json
def create
#person = Person.new(person_params)
respond_to do |format|
if #person.save
format.html { redirect_to #person, notice: 'Person was successfully created.' }
format.json { render :show, status: :created, location: #person }
else
format.html { render :new }
format.json { render json: #person.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /people/1
# PATCH/PUT /people/1.json
def update
respond_to do |format|
if #person.update(person_params)
format.html { redirect_to #person, notice: 'Person was successfully updated.' }
format.json { render :show, status: :ok, location: #person }
else
format.html { render :edit }
format.json { render json: #person.errors, status: :unprocessable_entity }
end
end
end
# DELETE /people/1
# DELETE /people/1.json
def destroy
#person.destroy
respond_to do |format|
format.html { redirect_to people_url, notice: 'Person was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_person
#person = Person.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def person_params
#params.require(:person).permit(:nome, :tipopessoa, :telefonefixo, :telefonecelular)
params.require(:person).permit(:nome, :tipopessoa, :telefonefixo, :telefonecelular,
legal_person_attributes: LegalPerson.attribute_names.map(&:to_sym))
#legal_person_attributes: [:id, :cnpj, :nomefantasia, :person_id])
end
end
Error
Parameters: {"utf8"=>"✓", "authenticity_token"=>"pAAOYapSgnF8H6O2cJMpHSN6POBwAzycy00Tij5TKFDv+8d+EErtdQGKuRbay4IxKrUQjXVPq5MblVgjv5Fa5g==", "person"=>{"nome"=>"qweqw", "tipopessoa"=>"wqeqweq", "telefonefixo"=>"qweqe", "telefonecelular"=>"qweqw", "legal_person_attributes"=>{"cnpj"=>"qweqw", "nomefantasia"=>"wqewe"}}, "commit"=>"Criar Person"}
(0.1ms) BEGIN
(0.2ms) ROLLBACK
use attribute name [:cnpj, :nomefantasia] instead of
LegalPerson.attribute_names.map(&:to_sym)

undefined method '_path' with references

I'm looking for make draw lesson with a differente gallery link with each lessons for the users can uplaod there work in.
I have a controller, model and view named "lesson" and the linked gallery is "illst_repot"
I have linked the illust_repot with references.
lesson:references and user:references
I have no problem on the index page, but I have a problem on new page
undefined method `illust_reports_path'
localhost:3000/lessons/1/illust_reports/new
This is my routes
lesson_illust_reports GET /lessons/:lesson_id/illust_reports(.:format) illust_reports#index
POST /lessons/:lesson_id/illust_reports(.:format) illust_reports#create
new_lesson_illust_report GET /lessons/:lesson_id/illust_reports/new(.:format) illust_reports#new
edit_lesson_illust_report GET /lessons/:lesson_id/illust_reports/:id/edit(.:format) illust_reports#edit
lesson_illust_report GET /lessons/:lesson_id/illust_reports/:id(.:format) illust_reports#show
PATCH /lessons/:lesson_id/illust_reports/:id(.:format) illust_reports#update
PUT /lessons/:lesson_id/illust_reports/:id(.:format) illust_reports#update
DELETE /lessons/:lesson_id/illust_reports/:id(.:format) illust_reports#destroy
lessons GET /lessons(.:format) lessons#index
POST /lessons(.:format) lessons#create
new_lesson GET /lessons/new(.:format) lessons#new
edit_lesson GET /lessons/:id/edit(.:format) lessons#edit
lesson GET /lessons/:id(.:format) lessons#show
PATCH /lessons/:id(.:format) lessons#update
PUT /lessons/:id(.:format) lessons#update
DELETE /lessons/:id(.:format) lessons#destroy
routes.rb
resources :lessons do
resources :illust_reports
end
illust_reports_controller.rb
class IllustReportsController < ApplicationController
before_action :set_illust_report, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
before_action :illust_report_owner, only: [:edit, :update, :destroy]
# GET /illust_reports
# GET /illust_reports.json
def index
#illust_reports = IllustReport.all
end
def illust_report_owner
unless #illust_report.user_id == current_user.id
flash[:notice] = "Accès refusé car tu n'es pas l'auteur de ce billet."
redirect_to illust_reports_path
end
end
# GET /illust_reports/1
# GET /illust_reports/1.json
def show
end
# GET /illust_reports/new
def new
#illust_report = current_user.illust_reports.build
end
# GET /illust_reports/1/edit
def edit
end
# POST /illust_reports
# POST /illust_reports.json
def create
#illust_report = current_user.illust_reports.build(illust_report_params)
respond_to do |format|
if #illust_report.save
format.html { redirect_to #illust_report, notice: 'Illust report was successfully created.' }
format.json { render :show, status: :created, location: #illust_report }
else
format.html { render :new }
format.json { render json: #illust_report.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /illust_reports/1
# PATCH/PUT /illust_reports/1.json
def update
respond_to do |format|
if #illust_report.update(illust_report_params)
format.html { redirect_to #illust_report, notice: 'Illust report was successfully updated.' }
format.json { render :show, status: :ok, location: #illust_report }
else
format.html { render :edit }
format.json { render json: #illust_report.errors, status: :unprocessable_entity }
end
end
end
# DELETE /illust_reports/1
# DELETE /illust_reports/1.json
def destroy
#illust_report.destroy
respond_to do |format|
format.html { redirect_to illust_reports_url, notice: 'Illust report was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_illust_report
#illust_report = IllustReport.find_by(id: params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def illust_report_params
params.require(:illust_report).permit(:title, :image, :commentaire, :lesson_id, :user_id)
end
end
_form.html.erb
<%= form_for(#illust_report) do |f| %>
<% if #illust_report.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(#illust_report.errors.count, "error") %> prohibited this illust_report from being saved:</h2>
<ul>
<% #illust_report.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
The model are linked.
I'm beginner with rails, I have searched a long time on google, and stack, and make many test before write this message.
Where is the problem ?
Thank you very much for your time.
undefined method `illust_reports_path'
You have nested resources. So the form_for should look like below
<%= form_for [#lesson, #illust_report] do |f| %>
and change the illust_reports_controller's new method like below
def new
#lesson = Lesson.find(params[:lesson_id])
#illust_report = current_user.illust_reports.build
end
Does lesson_illust_reports_path work?
As your illust_report resource is namespaced inside your lessons resource, you have to prepend lesson.

Issues with writing to Resident Model through Site controller to auto generate a new resident for specific site

Evening everyone! I am having an issue with my controller, it is returning undefined methodresidents' for nil:NilClass` when i try to render the page.
i am trying to populate a new resident to a specific site.
my sites_controller.rb looks as follows. -- I created the method site_resident to handle this. (thirs method from the top of the page.
class SitesController < ApplicationController
before_action :authenticate_user!
before_action :set_site, only: [:show, :edit, :update, :destroy]
# GET /sites
# GET /sites.json
def index
#sites = Site.all
end
# GET /sites/1
# GET /sites/1.json
def show
end
def site_resident
#resident = #site.residents.new
end
# GET /sites/new
def new
#site = Site.new
end
# GET /sites/1/edit
def edit
end
# POST /sites
# POST /sites.json
def create
#site = Site.new(site_params)
respond_to do |format|
if #site.save
format.html { redirect_to #site, notice: 'Site was successfully created.' }
format.json { render :show, status: :created, location: #site }
else
format.html { render :new }
format.json { render json: #site.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /sites/1
# PATCH/PUT /sites/1.json
def update
respond_to do |format|
if #site.update(site_params)
format.html { redirect_to #site, notice: 'Site was successfully updated.' }
format.json { render :show, status: :ok, location: #site }
else
format.html { render :edit }
format.json { render json: #site.errors, status: :unprocessable_entity }
end
end
end
# DELETE /sites/1
# DELETE /sites/1.json
def destroy
#site.destroy
respond_to do |format|
format.html { redirect_to sites_url, notice: 'Site was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_site
#site = Site.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def site_params
params.require(:site).permit(:call_sign, :address, :unit_number, :city, :prov, :postal_code, :ec1_n, :ec1_t, :ec1_t, :ec2_n, :ec2_t, :ec2_e, :ec3_n, :ec3_t, :ec3_e, :lat, :lng)
end
end
My routes.rb file look like this :
Rails.application.routes.draw do
root 'home#index'
resources :residents
resources :sites do
member do
get :site_resident
end
end
devise_for :users
im sure its something small that im overlooking but i cant seem to wrap my head around it. thanks for the help in advance!
You need to add :site_resident to your array for the before_action :set_site.
The line should read:
before_action :set_site, only: [:show, :edit, :update, :destroy, : site_resident]

New to Ruby on Rails - Association Issue

I am trying to set the associations . By now I have both models Post and Comment with their associations (in theory).
The problem is that when I try to see the comment of a specific post it says that such method does not exist.
I am sure forgetting something kinda obvious but I can't figure it out.
Thanks in advance!
MODELS
class Post < ActiveRecord::Base
has_many :comments, dependent: :destroy
end
class Comment < ActiveRecord::Base
belongs_to :post
end
And i got the error on rails console:
p = Post.all
p[0].comments
"undefined method comments for post"
Controllers:
Coment:
class CommentsController < ApplicationController
before_action :set_comment, only: [:show, :edit, :update, :destroy]
# GET /comments
# GET /comments.json
def index
#comments = Comment.all
end
# GET /comments/1
# GET /comments/1.json
def show
end
# GET /comments/new
def new
#comment = Comment.new
end
# GET /comments/1/edit
def edit
end
# POST /comments
# POST /comments.json
def create
#comment = Comment.new(comment_params)
respond_to do |format|
if #comment.save
format.html { redirect_to #comment, notice: 'Comment was successfully created.' }
format.json { render action: 'show', status: :created, location: #comment }
else
format.html { render action: 'new' }
format.json { render json: #comment.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /comments/1
# PATCH/PUT /comments/1.json
def update
respond_to do |format|
if #comment.update(comment_params)
format.html { redirect_to #comment, notice: 'Comment was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: #comment.errors, status: :unprocessable_entity }
end
end
end
# DELETE /comments/1
# DELETE /comments/1.json
def destroy
#comment.destroy
respond_to do |format|
format.html { redirect_to comments_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_comment
#comment = Comment.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def comment_params
params.require(:comment).permit(:post_id, :body)
end
end
Post:
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]
# GET /posts
# GET /posts.json
def index
#posts = Post.all
end
# GET /posts/1
# GET /posts/1.json
def show
end
# GET /posts/new
def new
#post = Post.new
end
# GET /posts/1/edit
def edit
end
# POST /posts
# POST /posts.json
def create
#post = Post.new(post_params)
respond_to do |format|
if #post.save
format.html { redirect_to #post, notice: 'Post was successfully created.' }
format.json { render action: 'show', status: :created, location: #post }
else
format.html { render action: 'new' }
format.json { render json: #post.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /posts/1
# PATCH/PUT /posts/1.json
def update
respond_to do |format|
if #post.update(post_params)
format.html { redirect_to #post, notice: 'Post was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: #post.errors, status: :unprocessable_entity }
end
end
end
# DELETE /posts/1
# DELETE /posts/1.json
def destroy
#post.destroy
respond_to do |format|
format.html { redirect_to posts_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_post
#post = Post.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def post_params
params.require(:post).permit(:title, :body)
end
end
Try this
has_many :comments, :class_name => "Comment", :foreign_key => :post_id
I think this is because you're trying to pull all comments for all posts, try this in rails console. This will only pull the first Post and then its related comment.
p = Post.first
p.comments
Are you getting an error on the view as well? If so, can you post the code from the view in question.

NoMethodError in Courses#edit undefined method `model_name'

I need help with the follow problem. I have been looking at similar questions but am still unable to find the solution to the problem. I am currently having this problem.
NoMethodError in Courses#edit
undefined method `model_name' for #Class:0xb5068474
the error seems to be with this line of code.
<%= simple_fields_for #lesson do |f| %>
<%= f.input :lesson_name %>
<%end%>
The lesson database is link to the course database, where course has_many lessons and lesson belongs_to course. I think that the problem may be due to my controller code. I am relatively new and not very sure about how to go about solving this problem.
I am able to go to create page to create that relation but nothing else is saved inside the database but the id of course and lesson. However, when i go to the edit page for course, this error pops out.
courses_controller.rb
class CoursesController < ApplicationController
before_action :set_course, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, :except => [:show,:index]
# GET /courses
# GET /courses.json
def index
#courses = Course.all
end
# GET /courses/1
# GET /courses/1.json
def show
end
# GET /courses/new
def new
#course = Course.new
#lesson = #course.lessons.build
end
# GET /courses/1/edit
def edit
#course = Course.find(params[:id])
#lesson = #course.lessons
end
# POST /courses
# POST /courses.json
def create
#course = Course.new(course_params)
#course.lessons.new(lesson_params)
respond_to do |format|
if #course.save
format.html { redirect_to #course, notice: 'Course was successfully created.' }
format.json { render action: 'show', status: :created, location: #course }
else
format.html { render action: 'new' }
format.json { render json: #course.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /courses/1
# PATCH/PUT /courses/1.json
def update
respond_to do |format|
if #course.update(course_params)
#course.lesson.update_attributes(lesson_params)
#course.staff_ids=params[:course][:staff_ids]
format.html { redirect_to #course, notice: 'Course was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: #course.errors, status: :unprocessable_entity }
end
end
end
# DELETE /courses/1
# DELETE /courses/1.json
def destroy
#course.destroy
respond_to do |format|
format.html { redirect_to courses_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_course
#course = Course.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def course_params
params.require(:course).permit(:course_code, :course_name, :year_of_study, :discipline, :Acad_unit, :cohort_size, :remark)
end
def lesson_params
params.require(:lesson).permit(:lesson_type, :lesson_name, :num_lesson, :frequency)
end
end
lesson.rb
class Lesson < ActiveRecord::Base
belongs_to :course
end
course.rb
class Course < ActiveRecord::Base
validates_presence_of :course_code, :course_name
validates_uniqueness_of :course_code, :course_name
validates :year_of_study, :Acad_unit, :cohort_size, :numericality => { :greater_than => 0}
has_and_belongs_to_many :staffs, join_table: :scheduleCourse
has_many :lessons, dependent: :destroy
end
Please give me some advise. Thanks in advance
The error that you get:
undefined method `model_name` for #Class:0xb5068474
Means that simple_fields_for method is doing something like #lesson.class.model_name, which is ok when object you pass (#lesson) is an instance of ActiveRecord::Base, but in edit action you define #lesson
#lesson = #course.lessons
As a relation, so it is not one Lesson instance, it is internal ActiveRecord object for storing relations. If for instance you call first on it:
#lesson = #course.lessons.first
This should work. Or you can iterate through collection of lessons in view to create form for each one of them, it depends on what you want to do.