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.
Related
New to Rails and trying to figure out why I'm getting the above error message when I try to view my index properties page. I'm using Devise and CanCanCan. Code is below. Please let me know if something missing that would help identify problem.
View:
<% #properties.each do |property| %>
<div class = "row for-sale-header">
<div class="col-xs-8">
<% if user_signed_in? && current_user? %>
<%= link_to edit_property_path(property) do %>
<i class="glyphicon glyphicon-edit" aria-hidden="true"></i> Edit
<% end %><br />
<% end %>
<h5>Property ID: <%= property.id %> <br /> </h5>
<%= property.description %>
</div>
</div>
<br />
<% end %>
Controller:
class PropertiesController < ApplicationController
before_action :authenticate_user!, except: [:index]
before_action :set_user, only: [:show, :edit, :update]
def index
#properties = Property.all
end
def new
#property = current_user.properties.new
end
def create
#property = current_user.properties.new(property_params)
respond_to do |format|
if #property.save
format.html { redirect_to #property, notice: "Property was successfully created." }
format.json { render :show, location: #property }
else
format.html { render :new }
format.json
end
end
end
def update
respond_to do |format|
if #property.update(property_params)
format.html { redirect_to #property, notice: "You've successfully updated your property listing!" }
format.json { render :show, status: :ok, location: #property }
else
format.html { render :edit }
format.json { render json: #property.errors, status: :unprocessable_entity }
end
end
end
private
def property_params
params.require(:property).permit(:street, :city, :province, :postal_code, :description, :picture)
end
def set_user
#property = Property.find(params[:id])
end
end
Application Controller:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if:
:devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :name
end
end
I thought current_user could be used anywhere in the app based on Devise documentation on using it as a helper.
current_user can be used any where in the app. current_user? is not a method provided by Devise.
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.
I've done a simple project about paper_trail, however I encountered a problem. When I created or updated completely there were two message show in the view:
Product was successfully created. undo
Product was successfully created. <a data-method="post" href="/versions/148/revert" rel="nofollow">undo</a>
here is my controller file:
class ProductsController < ApplicationController
before_action :set_product, only: [:show, :edit, :update, :destroy]
# GET /products
# GET /products.json
def index
#products = Product.order(:name)
respond_to do |format|
format.html
format.csv { send_data #products.to_csv }
end
end
# GET /products/1
# GET /products/1.json
def show
end
# GET /products/new
def new
#product = Product.new
end
# GET /products/1/edit
def edit
end
# POST /products
# POST /products.json
def create
#product = Product.new(product_params)
respond_to do |format|
if #product.save
format.html { redirect_to #product, notice: "Product was successfully created. #{undo_link}" }
format.json { render action: 'show', status: :created, location: #product }
else
format.html { render action: 'new' }
format.json { render json: #product.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /products/1
# PATCH/PUT /products/1.json
def update
respond_to do |format|
if #product.update(product_params)
format.html { redirect_to product_url, notice: 'Product was successfully updated.' "#{undo_link}" }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: #product.errors, status: :unprocessable_entity }
end
end
end
# DELETE /products/1
# DELETE /products/1.json
def destroy
#product.destroy
respond_to do |format|
format.html { redirect_to products_url, notice: "Successfully destroyed product. #{undo_link}" }
format.json { head :no_content }
end
end
def import
Product.import(params[:file])
redirect_to root_url, notice: "Products imported."
end
private
# Use callbacks to share common setup or constraints between actions.
def set_product
#product = Product.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def product_params
params.require(:product).permit(:name, :price)
end
def undo_link
view_context.link_to("undo", revert_version_path(#product.versions.scoped.last), :method => :post)
end
end
and the layout file here:
<!DOCTYPE html>
<html>
<head>
<title>Store</title>
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= csrf_meta_tags %>
</head>
<body>
<div id="container">
<% flash.each do |name, msg|%>
<%= content_tag :div, raw(msg), :id => "flash_#{name}" %>
<% end %>
<%= yield %>
</div>
</body>
</html>
I expect to show message once, however it show twice, so please tell me where my errors?
You are calling a flash message in both your create action and your view.
Create action:
format.html { redirect_to #product, notice: "Product was successfully created. #{undo_link}" }
View:
<% flash.each do |name, msg|%>
<%= content_tag :div, raw(msg), :id => "flash_#{name}" %>
<% end %>
The first gives:
Product was successfully created. undo
The latter show all raw output because of raw(msg):
Product was successfully created. <a data-method="post" href="/versions/148/revert" rel="nofollow">undo</a>
I encountered this error today, I search google for solution but I cannot find the correct answer for this. The error:
NoMethodError at /master/hotels/import
undefined method `id' for nil:NilClass
This is the templete file:
row
.col-xs-12
%p.pull-left
%button.btn.btn-white.btn-sm
一括削除
%p.pull-right
= link_to "新規作成", url_for(action: :new), class: "btn btn-white btn-sm"
= link_to "CSV Export", url_for(action: :index, format: 'csv'), class: "btn btn-white btn-sm"
= link_to "CSV Upload", url_for(action: :import), class: "btn btn-white btn-sm"
-#= form_tag url_for(action: :import), class: 'pull-right' do |f|
-#= file_field_tag :csv, as: :file
-#= submit_tag "CSV Upload", input_html: {class: "btn btn-white btn-sm"}
.col-xs-12
= render 'cruds/grid'
and here is my controller file:
class CrudsController < ApplicationController
before_action :load_crud
before_action :set_crud, only: [:show, :edit, :update, :destroy]
def load_crud
end
# GET /cruds
# GET /cruds.json
def index
#items_grid = initialize_grid(#model)
#csv = CSV.generate() do |csv|
csv << #model.column_names
#model.all.each do |item|
csv << item.attributes.values_at(*#model.column_names).map{|i| i.to_s.encode("cp932", "UTF-8")}
end
end
respond_to do |format|
format.html { render template: 'cruds/index'}
format.csv { send_data #csv }
#format.xls # {send_data #product.to_csv (col_sep: "|t")}
end
# render template: 'cruds/index'
end
# GET /cruds/1
# GET /cruds/1.json
def show
render template: 'cruds/show'
end
# GET /cruds/new
def new
#crud = #model.new
render template: 'cruds/new'
end
# GET /cruds/1/edit
def edit
render template: 'cruds/edit'
end
# POST /cruds
# POST /cruds.json
def create
#crud = #model.new(crud_params)
respond_to do |format|
if #crud.save
format.html { redirect_to [:master, #crud], notice: 'Crud was successfully created.' }
format.json { render action: 'show', status: :created, location: #crud }
else
format.html { render action: 'new' }
format.json { render json: #crud.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /cruds/1
# PATCH/PUT /cruds/1.json
def update
respond_to do |format|
if #crud.update(crud_params)
format.html { redirect_to [:master, #crud], notice: 'Crud was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: #crud.errors, status: :unprocessable_entity }
end
end
end
# DELETE /cruds/1
# DELETE /cruds/1.json
def destroy
#crud.destroy
respond_to do |format|
format.html { redirect_to action: :index }
format.json { head :no_content }
end
end
def import
#model.import(params[:file])
redirect_to root_url, notice: "Products imported."
end
private
# Use callbacks to share common setup or constraints between actions.
def set_crud
#crud = #model.find_by_id(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def crud_params
params[#hash].permit(#model.attribute_names)
end
end
I'm very confused about this error, can someone tell me any solution?
You're iterating over attribute names of #model, and reading them on #crud. #model has an attribute named id; #crud is nil. Either both should be same (probably), or in the somewhat unusual case that you do mean to read #model's attributes off of #crud, you need to check where #crud is assigned.
Your code is a bit confusing, some small comments:
model.find_by_id(params[:id])
Should be:
model.find(params[:id])
Next I would make sure that your view actually passes params[:id] to the view and not something like crud_id. If the latter is the case you should call this:
model.find_by(crud_id: params[:crud_id])
Lastly, I think you should add :file to your strong parameters.
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.