Wrong constant name user error

Hey all,

I have a table helper. Basically I want only certain tables to have a
view link for each record. Im not sure the best way to achieve this but
the way I can up with is to check if the model contains a certain method
such as viewable and if it does, then you create the link in a table
cell:

def table(collection, header_names, fields, class_name)
return false unless collection.any?
table_str = “”
table_str += “<table id=”" + class_name + “” class="" + class_name

  • “”>\n"
    table_str += “\t\n”
    table_str += “\t\t\n”
    header_names.each do |name|
    table_str += “\t\t\t”
    table_str += name
    table_str += “\n”
    end
    table_str += “\t\t\n”
    table_str += “\t\n”
    table_str += “\t\n”
    collection.each do |col|
    table_str += “\t\t\n”
    fields.each do |name|
    table_str += “\t\t\t\n”
    table_str += col[name].to_s
    table_str += “\t\t\t\n”
    if
    params[:controller].singularize.constantize.responds_to(:viewable)
    table_str += “\t\t\t\t\n”
    table_str += link_to “Edit”, edit_ +
    params[:action].singularize + _path
    table_str += “\t\t\t\t\n”
    end
    end
    table_str += “\t\t\n”
    end
    table_str += “\t\n”
    table_str += “\n”
    table_str.html_safe
    end

This file is located in helpers/layout_helper

Right now I get error: “wrong constant name user” when trying to display
the users page.

Or perhaps there’s a better way to determine whether you want to have a
link available for certain views (note this is not role-based user
authorization but rather some views will be editable and others not
period regardless of user)?

Thanks for response.

On Mar 23, 8:52pm, John M. [email protected] wrote:

params[:controller].singularize.constantize.responds_to(:viewable)

Presumably this is the line throwing the error. If params[:controller]
is users then you’ll be calling
constantize on the string user. Constants have to start with a capital
letter, so constantize throws an error.
As an aside, seing that much markup in a helper is off-putting(in the
same way that too much logic in a template is awkward), if I were you
i’d shift some of that into a partial

Fred

On 25 March 2011 16:47, John M. [email protected] wrote:


It works but I dont like that I am checking whether a model has the
method “viewable” just to display a link to a detail view in the table.
Is there a better way to determine if the current controller’s table
should contain a view or not?

Can’t you set an @variable in the controller and test it in the view
to determine whether to show the link?

Colin

Frederick C. wrote in post #988949:

On Mar 23, 8:52pm, John M. [email protected] wrote:

params[:controller].singularize.constantize.responds_to(:viewable)

Presumably this is the line throwing the error. If params[:controller]
is users then you’ll be calling
constantize on the string user. Constants have to start with a capital
letter, so constantize throws an error.
As an aside, seing that much markup in a helper is off-putting(in the
same way that too much logic in a template is awkward), if I were you
i’d shift some of that into a partial

Fred

Hey thanks you were right. Now it looks even more off putting:

def table(collection, header_names, fields, class_name)
return false unless collection.any?
table_str = “”
table_str += “<table id="” + class_name + “" class="” + class_name

  • “">\n”
    table_str += “\t\n”
    table_str += “\t\t\n”
    header_names.each do |name|
    table_str += “\t\t\t”
    table_str += name
    table_str += “\n”
    end
    if
    params[:controller].singularize.capitalize.constantize.method_defined?
    :viewable
    table_str += “\t\t\t”
    table_str += “View”
    table_str += “\n”
    end

    table_str += "\t\t</tr>\n"
    

    table_str += “\t\n”
    table_str += “\t\n”
    collection.each do |col|
    table_str += “\t\t\n”
    fields.each do |name|
    table_str += “\t\t\t\n”
    table_str += col[name].to_s
    table_str += “\t\t\t\n”
    end
    if
    params[:controller].singularize.capitalize.constantize.method_defined?
    :viewable
    table_str += “\t\t\t\n”
    table_str += link_to ‘View’, :action => ‘show’, :id =>
    col.id
    table_str += “\t\t\t\n”
    end

      table_str += "\t\t</tr>\n"
    end
    

    table_str += “\t\n”
    table_str += “\n”
    table_str.html_safe
    end

It works but I dont like that I am checking whether a model has the
method “viewable” just to display a link to a detail view in the table.
Is there a better way to determine if the current controller’s table
should contain a view or not?

Thanks for response.

On 25 Mar 2011, at 16:47, John M. [email protected] wrote:

Frederick C. wrote in post #988949:

On Mar 23, 8:52pm, John M. [email protected] wrote:

   if

params[:controller].singularize.capitalize.constantize.method_defined?
:viewable

Why not just controller.respond_to? :viewable ?

Fred

Frederick C. wrote in post #989266:

On 25 Mar 2011, at 16:47, John M. [email protected] wrote:

Frederick C. wrote in post #988949:

On Mar 23, 8:52pm, John M. [email protected] wrote:

   if

params[:controller].singularize.capitalize.constantize.method_defined?
:viewable

Why not just controller.respond_to? :viewable ?

Fred

Thanks for the idea. That should work.