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<thead>\n"
      table_str += "\t\t<tr>\n"
        header_names.each do |name|
          table_str += "\t\t\t<th>"
          table_str += name
          table_str += "</th>\n"
        end
      table_str += "\t\t</tr>\n"
    table_str += "\t</thead>\n"
    table_str += "\t<tbody>\n"
      collection.each do |col|
        table_str += "\t\t<tr>\n"
          fields.each do |name|
            table_str += "\t\t\t<td>\n"
              table_str += col[name].to_s
            table_str += "\t\t\t</td>\n"
            if
params[:controller].singularize.constantize.responds_to(:viewable)
              table_str += "\t\t\t\t<td>\n"
               table_str += link_to "Edit", edit_ +
params[:action].singularize + _path
              table_str += "\t\t\t\t</td>\n"
            end
          end
        table_str += "\t\t</tr>\n"
      end
    table_str += "\t</tbody>\n"
  table_str += "</table>\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.

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

Frederick Cheung wrote in post #988949:

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<thead>\n"
      table_str += "\t\t<tr>\n"
        header_names.each do |name|
          table_str += "\t\t\t<th>"
          table_str += name
          table_str += "</th>\n"
        end
        if
params[:controller].singularize.capitalize.constantize.method_defined?
:viewable
          table_str += "\t\t\t<th>"
          table_str += "View"
          table_str += "</th>\n"
        end

      table_str += "\t\t</tr>\n"
    table_str += "\t</thead>\n"
    table_str += "\t<tbody>\n"
      collection.each do |col|
        table_str += "\t\t<tr>\n"
          fields.each do |name|
            table_str += "\t\t\t<td>\n"
              table_str += col[name].to_s
            table_str += "\t\t\t</td>\n"
        end
        if
params[:controller].singularize.capitalize.constantize.method_defined?
:viewable
          table_str += "\t\t\t<td>\n"
            table_str += link_to 'View', :action => 'show', :id =>
col.id
          table_str += "\t\t\t</td>\n"
        end

        table_str += "\t\t</tr>\n"
      end
    table_str += "\t</tbody>\n"
  table_str += "</table>\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.

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

Colin

Frederick Cheung wrote in post #988949:

    if

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

Why not just controller.respond_to? :viewable ?

Fred

Frederick Cheung wrote in post #989266: