Want to directly access MODEL from VIEW. Can;t :(

Hi
I have a model called navbar. It does not have a view or a controller
defined.

create_table :navbars do |t|
      t.string :name
      t.string :display_name
      t.string :url
      t.string :group_by_module
      t.boolean :default_link
      t.integer :sort_order

And in the model I have written few methods.

class Navbar < ActiveRecord::Base
def all_modules
  NavBar.find (:display_name, :url, :conditions => {:name =>
'module_bar'}, :order => 'sort_order')
end
def associated_quick_links (selected_module)
  NavBar.find (:display_name, :url, :default_link, :conditions =>
{:name => 'quick_links_bar', :group_by_module =>
selected_module}, :order => 'sort_order')
end
def associated_module (selected_quick_link)
  NavBar.find (:group_by_module, :conditions => {:name =>
'quick_links_bar', :display_name => selected_quick_links})
end
end

QUESTION --- I want to access these methods from views directly. When
I do <%= debug navbar.all_modules %> it fails. It cannot find the
navbar.

Can someone please guide me?
Thanks in advance

For accessing model method from view , you can define self methods in model and than directly access by ModelName.methodName

For example

class Navbar < ActiveRecord::Base

def self.all_modules
Ur stuff

end

end

in view
<% Navbar.all_modules %>

Did what you said..
Now getting error --- "undefined local variable or method `navbar' for
#<ActionView::Base:0x4dfce0c>"

can you tell me what you did exactly ?

Hi

QUESTION — I want to access these methods from views directly. When
I do <%= debug navbar.all_modules %> it fails. It cannot find the
navbar.

This will work fine only if you have navbar as an object of your Navbar model, confirm whether you have done the same.
As I observe that your method in model does not have anything related to specific object of the class, you can have it as a class method by defining it as self.all_modules. This can be directly used by Navbar.all_modules

Note: One should not use model methods in views directly. Use controller objects or helpers for the same.

  • Nayak

agree with Nayak,
If you didn’t create the object navbar than it will through the exception that is in your case.

or define static methods like I did and use directly by model name.

Avoid direct model’s method calls in view , use helper file or controller as suggested by Nayak.

~N A R E N

This is like a reference table which doesnt need a controller :expressionless:
And it is a reftable for what links to display on screen.

This is what I did finally.

class Navbar < ActiveRecord::Base
def self.all_modules
  NavBar.find (:display_name, :url, :conditions => {:name =>
'module_bar'}, :order => 'sort_order')
end
def self.associated_quick_links (selected_module)
  NavBar.find (:display_name, :url, :default_link, :conditions =>
{:name => 'quick_links_bar', :group_by_module =>
selected_module}, :order => 'sort_order')
end
def self.associated_module (selected_quick_link)
  NavBar.find (:group_by_module, :conditions => {:name =>
'quick_links_bar', :display_name => selected_quick_links})
end
end

And I am still getting
undefined local variable or method `navbar' for #<ActionView::Base:
0x4be1140>
Extracted source (around line #2):
1: <div id="content">
2: <%= debug navbar.all_modules %>

Please help

ok let me explain you in your code
following is your code
1:


2: <%= debug navbar.all_modules %>
now the navbar is undefined , please replace navbar to Navbar capital N that is your Model name
see in this line
class Navbar < ActiveRecord::Base

now try this and let me know

~N A R E N

<div id="content">
<%= debug NavBar.all_modules %>

Now it gives

uninitialized constant ActionView::Base::CompiledTemplates::NavBar
Extracted source (around line #2):
1: <div id="content">
2: <%= debug NavBar.all_modules %>

<div id="content">
<%= debug NavBar.all_modules %>

According to your previous posts the class is called Navbar, so you
need to type exactly that. Not navbar, NavBar, NAvBaR or anything like
that.

Fred

In the controller for the action you are testing, did you create an
instance of your Navbar class? You are defining a Navbar class, but a
class without an instance is fairly useless... Something like:

@navbar = Navbar.new

If so, then the view code as you had it:

<%= @navbar.all_modules %>

should have an instance of Navbar to work with. Your all_modules method
inside Navbar cons a little dubious though...

Well.. I am using it in application.html.erb --> layouts.
So where should I create the instance?

NavBar is a reference table whose content needs to be accessed in all
VIEWS.
This includes the application layout too.
Can you please guide which is the best way to model this??? + where to
initialize an instance?

If you want to initialise the Navbar instance somewhere that has to be
accessed by all views (or the layout), put it in the application
controller as a before_filter. For example:

class ApplicationController < ActionController::Base

  # Some other stuff

  before_filter :get_navbar

  def get_navbar
    @navbar = Navbar.new
  end

  # More stuff

end

Then in you view or layout you can access methods using the syntax as
outlined earlier:

<%= @navbar.all_modules %>

Have you tried it this way yet??? (capital N only!)

<%= debug Navbar.all_modules %>