NoMethodError Ruby setup - ruby-on-rails

I'm new to rails and i've tried to set up a new project. I'm running Ubuntu 14.
These are my steps:
rails new my_project -T this created my new project.
rake db:create this created my database
Then i edited my Gemfile and deleted gem 'sqlite3'
group :production do
gem 'pg'
gem 'rails_12factor'
end
group :development do
gem 'sqlite3'
end
bundle install --without production
rails g controller welcome index about to create controllers
As last step i edited config.rb:
root to: 'welcome#index'
Now, when i try to go to localhost:3000/welcome/index i get the following error:
Why? It should display /welcome/index with the placeholder HTML.
This is my Welcome Controller:
class WelcomeController < ApplicationController
def index
end
def about
end
end

In application.css -
Remove :
*= require_tree .
and try. I am sure this problem appears because of css.

Related

Doesn not work audited 4.7 gem for updating model

I am new to rails and I used audited 4.7 gem for my rails application to track loggers. I have no idea how do I add a comment to audit table record. thank you
Gemfile
gem "audited", "~> 4.7"
Model
class Client < ApplicationRecord
audit
# add to your Gemfile, and run bundle install to install it
gem "audited"
# install table for audited gem operation
rails generate audited:install
rails db:migrate
# open your model that you want to audited
class Client < ApplicationRecord
audit
end
# restart rails server
# how to check the action
#client = Client.first
#audits = #client.audits
if #audits
#audits.each do |audit|
if audit.user
audit.user.username
audit.action
end
end
end

Rails 5 - How to create custom scaffold generator?

The goal is for command...
bin/rails generate custom_scaffold Thing
... to generate the following 6 files:
db/migrate/201812031331_create_things.rb
app/models/thing.rb
app/controllers/things_controller.rb
app/serializers/thing_serializer.rb
test/fixtures/things.yml
test/integration/requests/things_request_test.rb
... using Rails 5.
My current setup does generate app/models/thing.rb but does not populate it with Thing.
Expected:
class Thing < ApplicationRecord
end
Currently:
class <%= class_name %> < ApplicationRecord
end
I have read through these Rails guides but to little avail.
Does anyone have a working example?
My setup:
# lib/generators/custom_scaffold/custom_scaffold_generator.rb
class CustomScaffoldGenerator < Rails::Generators::NamedBase
source_root File.expand_path('templates', __dir__)
def create_files
copy_file 'migration.rb', "db/migrate/#{timestamp}_create_#{plural_name}.rb"
copy_file 'model.rb', "app/models/#{file_name}.rb"
copy_file 'controller.rb', "app/controllers/#{plural_name}_controller.rb"
copy_file 'serializer.rb', "app/serializers/#{file_name}_serializer.rb"
copy_file 'fixture.yml', "test/fixtures/#{plural_name}.yml"
copy_file 'request_test.rb', "test/integration/requests/#{plural_name}_request_test.rb"
end
private
def timestamp
Time.now.utc.strftime('%Y%m%d%H%M%S')
end
end
# lib/generators/custom_scaffold/templates/model.rb
class <%= class_name %> < ApplicationRecord
end
# lib/generators/custom_scaffold/templates/controller.rb
module V1
module Public
class <%= class_name.pluralize %>Controller < ApplicationController
end
end
end
# lib/generators/custom_scaffold/templates/migration.rb
# Ignore for now
# lib/generators/custom_scaffold/templates/serializer.rb
# Ignore for now
# lib/generators/custom_scaffold/templates/fixture.yml
# Ignore for now
# lib/generators/custom_scaffold/templates/request_test.rb
# Ignore for now
# Gemfile
source 'https://rubygems.org'
ruby '2.4.1'
gem 'rails', '~> 5.1.6'
gem 'puma', '~> 3.7'
gem 'pg'
gem 'rack-cors', require: 'rack/cors'
gem 'olive_branch'
gem 'fast_jsonapi'
gem 'awesome_print'
gem 'byebug', '~> 10.0', groups: %i[development test]
gem 'yaml_db'
group :development do
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'mina', '~> 1.2', require: false
gem 'mina-puma', require: false
gem 'rubocop', require: false
gem 'annotate', require: false
end
You need to specify the file as a Thor template. Rails uses Thor templates for generating templates with ERB style code inside them.
Replace:
copy_file 'model.rb', "app/models/#{file_name}.rb"
With:
template 'model.rb.tt', "app/models/#{file_name}.rb"
By adding the .tt extension you're telling the generator to handle the file as a Thor template, which will interpret the Ruby code (ERB style) inside the file and then create a file with that same name minus the .tt extension. Any file you have without the .tt extension the generator will copy wholesale, without executing any of the code inside.
A useful tip: Sometimes you want to leave some ERB code inside a Thor template file without it being executed. By default any ERB style tags inside a .tt file will be process and in it's place a string will be written to the output file. You can avoid the processing of ERB tags but using a double percent sign in the tag.
For example, lets say you have a file named foo.erb.tt, which will create the file foo.erb when your generator runs. Let's also say we have a article_name variable and it's value is Breaking News
If you put <%= article_name %> in the file it will write Breaking News to the foo.erb.
If you put <%%= article_name %> (notice the %%) it will write <%= article_name %>to the foo.erb.
I found the following reference handy when learning this stuff.
Rails Application Templates article at Rails Guides.
Creating and Customizing Rails Generators & Templates article at Rails Guides.
Thor Actions Docs these are the commands used in our template.rb file.
Thor comes with several actions that help with script and generator tasks. You might be familiar with them since some came from Rails Templates. They are: say, ask, yes?, no?, add_file, remove_file, copy_file, template, directory, inside, run, inject_into_file and a couple more.

Whois gem not working in rails

class DomaincheckerController < ApplicationController
def index
end
def store
r =Whois.whois(secure_params['domain'])
render :text => "#{r}"
end
private
def secure_params
params.require(:whois).permit(:domain)
end
end
This is my domainchecker controller. The index method renders a form. After submitting the form it goes to store method. Here I am trying to use the whois gem. I have installed whois gem by running gem install whois. But I am getting this error.
uninitialized constant DomaincheckerController::Whois
The problem is that you installed the gem directly and not using bundler, therefore the Rails app can't find the dependency.
In order to install a gem in a Rails project you need to edit the Gemfile file and add the gem there. Once added, run
$ bundle
in order to install the dependency. Check the documentation about the Gemfile.

Cannot find file or constant when using a gem locally in a Rails app

I have a gem that I am making and it is located at the same level as a rails app.
I am trying to use the gem in the rails app, but am not able to make it work - the constant I am trying to use, which is defined in the gem, is not accessible to the rails app for some reason.
What am I doing wrong here? What steps can I take to begin debugging the cause of the problem?
In the rails console, $:.grep /mygem/ shows me ["/Users/zabba/mygem/lib"]
Directory structure, with the contents of certain files:
~/mygem/
lib/
mygem/
some_class.rb
module Mygem
class SomeClass
end
end
mygem.rb
require 'mygem/some_class'
~/railsapp/
Gemfile:
gem 'mygem', path: '../mygem', require: 'mygem'
app/
models/
a_model.rb:
# require 'mygem' cannot find file
class AModel
def hello_world
SomeClass.new # Cannot find constant
Mygem::SomeClass.new # Cannot find constant
end
end
Can you create a folder vendor/gems and copy your gem in there. Then in you Gemfile
Gemfile
gem 'mygem', :path => "vendor/gems/mygem-0.0.1"
Then bundle install

Rails own gem and uninitialized constant

I am trying to made my own gem, but I am still getting an error,
Here is my gem structure:
order
- app
- controllers
- order_controller.rb
- lib
- order
order.rb
And content of the order_controller.rb:
class Order::OrderController < ApplicationController
def index
puts "asd"
end
end
I've got order gem added to the main application Gemfil.
I defined my root to lead to index action of that controller:
root :to => "order/order#index"
but when I try to access homepage I get:
uninitialized constant Order::OrderController
What I've done wrong?
Did you run bundle install after adding the gem in the Gemfile? By the way, why are you making a gem for that structure instead of making a Rails project with that structure?

Resources