The ActiveRecord and ActionController have ::Base attached to it. I googled for this but still couldn't find an explanatory answer. I am curious to know how they exactly work.
You go to GitHub and then press t and then type Base.
You will find classes like ActiveRecord::Base.
The double colon is a scope operator, and in this says that we want the class Base in the module ActionController.
module ActionController
class Base
# ... implementation
end
end
module ActiveRecord
class Base
# ... this is a different class than ActionController::Base
end
end
class MyController < ActionController::Base
# class that inherits from class Base in module ActionController
end
class MyModel < ActiveRecord::Base
# class that inherits from class Base in module ActiveRecord
end
Related
I have a Controller Test Class file that differs from the name of the original Controller Class
class MyController < ApplicationController
end
class MyControllerNotLoggedTest < ActionController::TestCase
end
When I run the tests I have this error:
RuntimeError: #controller is nil: make sure you set it in your test's setup method.
In Rails 6 looks like it is like this:
class MyControllerNotLoggedTest < ActionController::TestCase
tests MyController
end
https://www.rubydoc.info/docs/rails/4.1.7/ActionController/TestCase#label-Controller+is+automatically+inferred
I am writing classes for a SQL Database in Ruby, a few of the query methods are common throughout all my classes so I want to move these methods into a parent class. I can't figure out how to get the original class call to show up in the parent class. Since my classes are the names of my tables, I need them to have access to them in my parent method. I've tried using self.class but that just returns Class, not the actual class I'm using the method on.
Here is the code I want to move into the parent class:
require_relative 'questions_databse.rb'
class User
attr_accessor :id, :fname, :lname
def self.find_by_id(id)
user = QuestionDatabase.instance.execute(<<-SQL, id)
SELECT
*
FROM
users
WHERE
users.id = ?
SQL
user.map { |user| User.new(user) }.first
end
Now what I need to do is something like this:
require_relative 'questions_databse.rb'
require_relative 'modelbase.rb'
class User < ModelBase
attr_accessor :id, :fname, :lname
# no self.find_by_id(id)
Then I want the parent class to do something like this:
require 'active_support/inflector'
class ModelBase
def self.find_by_id(id)
object = QuestionDatabase.instance.execute(<<-SQL, id)
SELECT
*
FROM
#{self.chid_class.name.tableize}
WHERE
#{self.chid_class.name.tableize}.id = ?
SQL
object.map { |object| self.child_class.new(object) }.first
end
end
I have 4 other table classes that I use this method on, so I need to be able to have the code tell exactly what class called it so that the SQL query will run properly.
require 'active_support/inflector'
class ModelBase
def self.find_by_id(id)
p self.class.name
end
end
User.find_by_id(1) #=> "Class"
That is result when I use the self.class.name
I am learning how to code right now and this is the problem that the lesson is giving me. I know there may be easier ways to do this, but I probably haven't learned those yet.
In a class method like your find_by_id:
class ModelBase
def self.find_by_id(id)
p self.class.name
end
end
self is the class itself (so self.class is Class) so you want to look at self.name:
class ModelBase
def self.find_by_id(id)
p name
end
end
I have a rather untypical situation:
When I build an Application, I created a class witch contained several nested classes. At the beginning, this was manageable, but now so the file is so big, that I want to move each nested class to its own file.
Is this possible in VB.NET, or do I need to move each nested class out of the "mother" class?
I have Resharper installed, if this helps..
Structure:
Public Class A
Public Class NestedA
End Class
Public Class NestedB
End Class
End Class
Use Partial class:
Partial Public Class ParcialTest
Public Class NestedA
End Class
End Class
And in another file:
Partial Public Class ParcialTest
Public Class NestedB
End Class
End Class
Compiler will merge all these Partial class parts into one for you.
This is a question from a rails noob trying to understand concerns and scopes.
I always thought scopes were class methods in rails but then the other day I saw this code from DHH:
module Visible
extend ActiveSupport::Concern`
module ClassMethods
def visible_to(person)
where \
"(#{table_name}.bucket_id IN (?) AND
#{table_name}.bucket_type = 'Project') OR
(#{table_name}.bucket_id IN (?) AND
#{table_name}.bucket_type = 'Calendar')",
person.projects.pluck('projects.id'),
calendar_scope.pluck('calendars.id')
end
end
end
So the way the visible method is used is like so:
current_account.posts.visible_to(current_user)
This is what is confusing me. Self here is a collection of posts so we are acting on instances whereas the visible method seems to be meant to be used as a class method. Isn't david trying to call a class method as a dynamic scope? Could someone please clarify?
Class methods on classes which inherit ActiveRecord::Base can be used also as scopes (on ActiveRecord Relation objects).
Since the module Visible was meant to be mixed into a model which inherits ActiveRecord::Base, its class method visible_to can be used also as a scope.
If this did not clear the issue, you can implement a scope which gets all adult users (age > 20) in the following ways:
class User < ActiveRecord::Base
scope :adult, lambda { where("age > ?", 20) } # with a scope
class << self
def adult # with class method
where("age > ?", 20)
end
end
end
And use it exactly the same with User.adult
I migrated from rails 2.x to 3.x. Now when calling a controller method throws
undefined method `my_helper_method' for nil:NilClass
MyController.rb
class MyController < ApplicationController
def foo
#template.my_helper_method
end
end
MyControllerHelper.rb
class MyControllerHelper
def my_helper_method
puts "Hello"
end
end
ApplicationController
class ApplicationController < ActionController::Base
helper :all
end
How to get this working?
This is actually answered in another SO post: Rails 3: #template variable inside controllers is nil
Essentially, you can replace #template with view_context
#template is an object, in your case nil. If this object doesn't has the method (my_helper_method) in it, you cannot call it (especially not if it is nil).
Methods defined in helpers are called like regular methods. But not in controllers, they are called in views. Your helper :all just makes all helpers available to the views.
So, in your view: my_helper_method :arg1, :arg2
IF you need a method for your object (#template), you need to give your object this method.
Example:
class Template < ActiveRecord::Base
def my_helper_method
# do something on a template instance
end
end
class MyController < ApplicationController
def foo
#template = Template.first
#template.my_helper_method # which actually isn't a helper
end
end
What helpers do:
module MyHelper
def helper_method_for_template(what)
end
end
# in your view
helper_method_for_template(#template)
Mixing in a helper (be aware of having a mess in your code when mixing view helpers with views and models)
class Template < ActiveRecord::Base
include MyHelper
# Now, there is #template.helper_method_for_template(what) in here.
# This can get messy when you are making your helpers available to your
# views AND use them here. So why not just write the code in here where it belongs
# and leave helpers to the views?
end