Melbourne2991
Melbourne2991

Reputation: 11797

Setting Helper Method Return Value as Instance Variable

So I have an application wide helper method for breadcrumbs, that I use in the layout, across all view pages.

Here is the method below

- if request.fullpath != '/'
        .row
            .col-md-12
                #breadcrumbs
                    = link_to 'home', '/'
                    %span  »
                    - @BreadcrumbsHelper = breadcrumbs
                    - i = 0
                    - @BreadcrumbsHelper.each do |name, breadcrumb| 
                        = link_to name, breadcrumb
                        - if i != (@BreadcrumbsHelper.count - 1) 
                            %span  »
                        - i = i + 1     

From what I understand, variables in the view should be instance variables and not methods, however declaring the instance variable in the view doesn't really seem to make sense, but I am not sure how else to go about it, would it be acceptable just to leave it as a method call ie breadcrumbs.each do for example? Would that even work? What is the best practice.

EDIT (the helper, just in case it helps) :

module BreadcrumbsHelper
    def breadcrumbs
        current_path = request.fullpath
        noparam_path = current_path.split('?')

        path_parts   = noparam_path[0].split('/')

        path_parts.shift

        counter = path_parts.size
        new_paths = Hash.new

        counter.times do
            new_path = ""
            path_name = ""
            i = 0

            path_parts.each do |part|
                if i < counter
                    if new_path == ""
                        new_path = '/' + part
                    else
                        new_path = new_path + '/' + part
                    end

                    path_name = part
                    i = i + 1
                end
            end

            counter = counter -1

            #path functions

            def routeValid(new_path)
                route = "/" + new_path.gsub("_","/")

                route_valid = true
                begin
                    Rails.application.routes.recognize_path(route, :method => :get)
                rescue
                    # error means that your route is not valid, so do something to remember that here
                    route_valid = false
                end
                return route_valid
            end

            def processPath(new_path, path_name, new_paths)
                if routeValid(new_path) == true 
                    #Optional Overrides
                    if path_name == "signup"
                        path_name = "sign up"
                    end

                    new_paths[path_name] = new_path 
                end
            end

            processPath(new_path, path_name, new_paths)

        end

        new_paths = Hash[new_paths.to_a.reverse]

        return new_paths

    end
end

Upvotes: 0

Views: 1081

Answers (1)

Peter Goldstein
Peter Goldstein

Reputation: 4555

Helpers are modules that are included in the view. They are not accessed via instance variables.

You should be able to access a method defined in a helper directly in a view. So rather than writing

- @BreadcrumbsHelper = breadcrumbs
- i = 0
- @BreadcrumbsHelper.each do |name, breadcrumb|

you would just write something like

- breadcrumbs.each do |name, breadcrumb|

You will also probably want to capture the count of breadcrumbs before the loop, with something like

- my_breadcrumbs = breadcrumbs
- breadcrumbs_count = my_breadcrumbs.size
- my_breadcrumbs.each do |name, breadcrumb|

and replacing

@BreadcrumbsHelper.count

with

breadcrumbs_count

Upvotes: 2

Related Questions