When I try to use the webdriver-user-agent gem, I cannot access the module, let alone its methods.
in Rails.root/Gemfile.lock:
GEM
remote: https://rubygems.org/
specs:
# ...
watir-webdriver (0.6.10)
selenium-webdriver (>= 2.18.0)
webdriver-user-agent (7.1)
facets
json
selenium-webdriver
# ...
in Rails.root/app/models/some_model.rb:
class SomeModel < ActiveRecord::Base
def some_function
driver = WebDriver::UserAgent.driver(browser: :firefox, agent: :iphone, orientation: :portrait)
# other functionality ...
end
end
Load environment
rails c
Using the class:
2.0.0-p353 :001 > s = SomeModel.last
2.0.0-p353 :002 > s.some_function
NameError: uninitialized constant SomeModel::WebDriver
Is Rails looking for the Module in the wrong place by looking for it within SomeModel? Am I accessing this incorrectly? The module not is available:
2.0.0-p353 :003 > Webdriver::UserAgent
NameError: uninitialized constant WebDriver # corrected on edit
I've tried including require 'webdriver-user-agent' at the top of the class file, and then include WebDriver -- same error, but on loading of the model instance.
I filed a bug report in the repo, but I'm sure I'm doing something dumb here...
Additional info:
Centos 6.5
Rails 4.1.4
Ruby 2.0
Rubygems 2.2.2
You are trying to look for the module:
WebDriver
However, the webdriver-user-agent gem uses the module:
Webdriver
Notice the difference in the lowercase 'd'. Class and module names are case-sensitive, which is why the constant is not being found.
The function should work by correcting the module name:
class SomeModel < ActiveRecord::Base
def some_function
driver = Webdriver::UserAgent.driver(browser: :firefox, agent: :iphone, orientation: :portrait)
# other functionality ...
end
end
Related
I'm creating a ruby gem with rails 6. This is my main ruby gem file:
#lib/ruby_gem_name.rb
require 'active_support'
require 'active_record'
require 'ruby_gem_name/version'
require 'ruby_gem_name/class_methods'
# frozen_string_literal: true
puts 'The gem was loaded'
module RubyGemName; end
This is lib/ruby_gem_name/class_methods.rb
module RubyGemName
module ClassMethods
def self.ruby_gem_name_class_method
puts 'Hello'
end
end
extend ClassMethods
end
i enter in irb console and i can see:
ruby-gem-name$ irb
2.7.1 :001 > require 'ruby-gem-name'
The gem was loaded
=> true
2.7.1 :002 > RubyGemName::ClassMethods.ruby_gem_name_class_method
Hello
=> nil
Now....I've added my gem to the gemfile in my rails project:
gem 'ruby_gem_name', path: 'path_to_ruby_gem_name'
I can see the installed gem in Gemfile.lock:
PATH
remote: 'path_to_ruby_gem_name'
specs:
ruby_gem_name (0.1.0)
activerecord (~> 6)
activesupport (~> 6)
rails (~> 6)
GEM
remote: https://rubygems.org/
specs:
actioncable (6.0.3.5)
actionpack (= 6.0.3.5)
Now, i want to use this class method in models of my rails project:
i have this code:
class Cart < ApplicationRecord
extend RubyGemName::ClassMethods
end
and when i try to use this class method from my rails project console, i see:
shopping-cart$ bundle exec rails c
Running via Spring preloader in process 32494
Loading development environment (Rails 6.0.3.5)
2.7.1 :001 > Cart.ruby_gem_name_class_method
Traceback (most recent call last):
1: from (irb):1
NoMethodError (undefined method `ruby_gem_name_class_method' for Cart (call 'Cart.connection' to establish a connection):Class)
In order to use the method ruby_gem_name_class_method as a class method you need to use extend as eugen points out in their example. If you use extend then the Module's methods are already Class methods, therefore the self on your ruby_gem_name_class_method is redundant.
Your module's code should change to this:
module RubyGemName
module ClassMethods
def ruby_gem_name_class_method
puts 'Hello'
end
end
end
The other approach is to use include which will make the Module's methods available on the instance of the Class and you can achieve this by modifying your Class:
class Cart < ApplicationRecord
include RubyGemName::ClassMethods
end
and then instantiate the object and call the instance method:
Cart.new.ruby_gem_name_class_method
You can omit self on the Module's method as it refers to the newly created instance.
You'll probably want to use extend instead of include, as in
class Cart < ApplicationRecord
extend RubyGemName::ClassMethods
end
extend will add the methods from RubyGemName::ClassMethods, as opposed to include, which will add them as instance methods.
For a more detailed explanation of extend vs. include, see https://stackoverflow.com/a/5008349/163640
I am using Sidekiq in one of my projects. Now I need to clear a queue,
the RetrySet, to be more specific.
Following this page from Sidekiq's Github manual, this should work:
Loading development environment (Rails 4.2.1)
>> Sidekiq::RetrySet.new.clear
NameError: uninitialized constant Sidekiq::RetrySet
But it doesn't. Sidekiq itself seems to be loaded:
>> Sidekiq
=> Sidekiq
What am I doing wrong here?
EDIT:
Using Sidekiq version 3.3.4
Looks like you need to require the api library explicitly.
require 'sidekiq/api'
See this for more info https://github.com/mperham/sidekiq/issues/1732
See https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/api.rb#L612
The inheritance explaination
class SortedSet
...
def clear
...
end
end
class JobSet < SortedSet
...
end
class RetrySet < JobSet
...
end
However, In my rails console it worked without needing me to require the library. It was already required. see
> require 'sidekiq/api'
=> false
I use Sidekiq 4.0.1
> Sidekiq::VERSION
=> "4.0.1"
This question already has an answer here:
Rails table_name_prefix is not working as expected
(1 answer)
Closed 1 year ago.
I have this code:
# app/models/ta.rb
module Ta
def self.table_name_prefix
'ta_'
end
end
...
# app/models/ta/article.rb
module Ta
class Article < ActiveRecord::Base
end
end
From the rails console...
# development environment
Loading development environment (Rails 4.1.6)
2.1.3 :001 > Ta::Article.table_name
=> "ta_articles"
2.1.3 :002 >
...
# production environment
Loading production environment (Rails 4.1.6)
2.1.3 :001 > Ta::Article.table_name
=> "articles"
2.1.3 :002 >
Why is this happening?
Add to config/initializers/namespace.rb something like:
require Rails.root.join('app', 'models', 'ta')
should solve your problem.
I know how to create a rails generator gem which is called like:
rails g my_generator command
And I know how to create a thor gem which can be called like:
my_generator command
But I don't know how to create a rails generator that can be called using an executable. I have tried by creating a lib/my_generator/cli.rb file like:
require 'thor'
module Mang
class Cli < Thor
include ::Rails::Generators::Base
desc "install_gem", "install a gem"
def install_gem
gem 'thor', "0.18.1"
end
end
end
But I get the following error despite having added Rails as a dependency in my gemspec.
uninitialized constant Rails (NameError)
The fix was just a matter of including the rails/generators/actions module.
require 'thor'
require 'rails/generators'
require 'rails/generators/actions'
module Mang
class Cli < Thor
include Thor::Actions
include Rails::Generators::Actions
desc "install_gem", "install a gem"
def install_gem
gem 'thor', "0.18.1"
end
end
end
I am looking at using ActiveResource but is now facing a problem that I am unable to figure out myself (was searching the net for a couple of days for the solution by now).
So I have an authentication app sitting at http://localhost:80 and a client on port :85
In my auth app
I have a User model with its controller which follows REST architecture and is set to respond to xml calls.
Here is what I have in my auth app:
models/User.rb
class User < ActiveRecord::Base
end
*controllers/users_controller.rb*
class UsersController < ApplicationController
respond_to :html, :xml, :js
def index
#users = User.find :all
respond_with #users
end
def show
#user = User.find(params[:id])
respond_with #user
end
.
.
.
end
In a client application
I have a class extending from active resource as follows:
models/user.rb
class User < ActiveResource::Base
self.site = "http://localhost:80"
end
Here is how I am trying to use it:
*controllers/sessions_controller.rb*
class SessionController < ApplicationController
def home
#user = User.find(:all)
end
end
what could go wrong, right?..
But then I am getting the following error:
Started GET "/" for 127.0.0.1 at 2013-09-02 08:33:44 +1200 Processing
by SessionsController#home as HTML Completed 500 Internal Server Error
in 3ms
NameError (uninitialized constant ActiveResource):
app/models/user.rb:1:in <top (required)>'
app/controllers/sessions_controller.rb:4:inhome'
Rendered
/usr/lib/ruby/gems/1.9.1/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_source.erb
(1.6ms) Rendered
/usr/lib/ruby/gems/1.9.1/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb
(2.7ms) Rendered
/usr/lib/ruby/gems/1.9.1/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb
(2.2ms) Rendered
/usr/lib/ruby/gems/1.9.1/gems/actionpack-4.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (37.4ms)
I am using:
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
Rails 4.0.0
activeresource (4.0.0) gem is installed
What could I possibly be doing wrong?
Is it possible that ActiveResource failing to connect to localhost:80 and as a result does not get initialized?
EDIT:
done rvm use 2.0.0 so now ruby version is: ruby 2.0.0p247 (2013-06-27 revision 41674) [i686-linux]
EDIT:
RubyGems Environment:
- RUBYGEMS VERSION: 2.0.7
- RUBY VERSION: 1.9.3 (2011-10-30 patchlevel 0) [i686-linux]
- INSTALLATION DIRECTORY: /usr/lib/ruby/gems/1.9.1
- RUBY EXECUTABLE: /usr/bin/ruby1.9.1
- EXECUTABLE DIRECTORY: /usr/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-linux
- GEM PATHS:
- /usr/lib/ruby/gems/1.9.1
- /home/dmitry/.gem/ruby/1.9.1
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- https://rubygems.org/
I have finally figured this out...
For some reason (I would be grateful if someone can post an explanation why) I had to require active resource manually in my user.rb file.
The correct code to make it work should be:
require 'active_resource'
class User < ActiveResource::Base
self.site = "http://localhost:80"
end
P.S
Thank you zeantsoi for your comments, those have led me into a search for reasons of this gem not being loaded.
In your Gemfile add the activeresource gem like so:
gem 'activeresource', require: 'active_resource'
This will make it behave as it should - without having to require it at the beginning of every activeresource model.
ActiveResource should be loaded in your config/application.rb file:
# config/application.rb
# Pick the frameworks you want:
require 'active_resource/railtie'
require "action_controller/railtie"
...
In this case you will be able to configure ActiveResource later in the same file, for example:
# config/application.rb
module TestClient
class Application < Rails::Application
config.active_resource.include_format_in_path = false
config.active_resource.site = "http://localhost:80"
...
This is handy if you want to set some default options for all your ActiveResource models and of course you can override any of these options for some specific model:
# app/models/user.rb
class User < ActiveResource::Base
self.include_format_in_path = true # append .json at the end of url
end