开发者

Rails-way - where to put this kind of helper method?

开发者 https://www.devze.com 2023-01-07 10:42 出处:网络
I\'m struggling a bit to find the right place for a helper method. The method basicly \'inspects\' a User-model object and should return some information about the \'progress\' of the user, eg. \"You

I'm struggling a bit to find the right place for a helper method. The method basicly 'inspects' a User-model object and should return some information about the 'progress' of the user, eg. "You need to add pictures", "Fill out your address" or "Add your e-mail-adress". None of the conditions I'm checking for are required, it's just like a "This is your profile co开发者_运维技巧mpleteness"-functionality as seen on LinkedIn etc.

Each of these 'actions' have a URL, where the user can complete the action, eg. a URL to the page where they can upload a profile photo if that is missing.

Since I need access to my named routes helpers (eg. new_user_image_path) I'm having a hard time figuring out the Rails-way of structuring the code.

I'd like to return an object with a DSL like this:

 class UserCompleteness
     def initialize(user)
     end

     def actions
        # Returns an array of actions to be completed
     end

     def percent
        # Returns a 'profile completeness' percentage
     end
 end

And user it with something like: @completeness = user_completeness(current_user)

However, if I'm adding this to my application_helper I don't have access to my named routes helpers. Same goes if I add it to my User-model.

Where should I place this kind of helper method?


This is a similar problem to that of Mailers. They are models, and should not cross the MVC boundaries, but need to generate views. Try this:

class UserCompleteness

  include ActionController::UrlWriter

  def initialize(user)
  end

  def actions
    # Returns an array of actions to be completed
    new_user_image_path(user)
  end

  def percent
    # Returns a 'profile completeness' percentage
  end
 end

But be aware you are breaking MVC encapsulation, which might make testing more difficult. If you can get away with some methods in the users helper instead of a class that might be better.


From the little i got your question i think you want a method which you can used in Controller as well as Views. To Accomplish this simple add method in application_controller.rb and named it hepler_method

Example:-

  class ApplicationController < ActionController::Base
    helper_method :current_user

    def current_user
      @current_user ||= User.find_by_id(session[:user])
    end

  end

you can use method current_user in both Controller as well as views

0

精彩评论

暂无评论...
验证码 换一张
取 消