2017-08-20 14 views
0

简单的问题。MVC中的好方法放置

将所有控制器相关的方法(但不能直接用于视图)放在帮助器中是否是一种好的做法?

我的意思是,我的控制器仅包含new,createedit等方法。里面这些方法通常有另一个叫类似的方法:

class SessionsController < ApplicationController 
    include SessionsHelper 

    ... 

    def destroy 
    sign_out if signed_in? 
    redirect_to root_path 
    end 
end 

module SessionsHelper 
    def signed_in? 
    !current_user.nil? 
    end 

    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

    def sign_out 
    forget(current_user) 
    session.delete(:user_id) 
    @current_user = nil 
    end 
end 

最近我读过的助手应该包括使用只考虑方法,所以我不太确定是否上述计数为方法,并因此,我的方法是否是一种不好的做法。

有人可以指点我认为这个好/坏做法的相关文件吗?

回答

2

这就是控制器关心的问题。它基本上是一个普通的ruby模块,没有任何附加的帮助者的含义。

# app/controllers/concerns/session.rb 
module Concerns 
    module Session 
    extend ActiveSupport::Concern 

    def signed_in? 
     !current_user.nil? 
    end 

    def forget(user) 
     user.forget 
     cookies.delete(:user_id) 
     cookies.delete(:remember_token) 
    end 

    def sign_out 
     forget(current_user) 
     session.delete(:user_id) 
     @current_user = nil 
    end 
    end 
end 

class SessionsController < ApplicationController 
    include Concerns::Session 

    helper_method :signed_in? # make it available in views 

    def destroy 
    sign_out if signed_in? 
    redirect_to root_path 
    end 
end 
+1

有一件事。从关注的内部将'helper_method:signed_in?'放到ApplicationController中,并将它放在'include Concerns :: Session'之后。在内部调用'helper_method'会导致'undefined method'错误。我编辑了你的答案,但需要同行评审。 – Kappa

+0

@Kappa:谢谢,添加了你的建议编辑。 –