在MVC中放置好方法

时间:2017-08-20 11:23:03

标签: ruby-on-rails model-view-controller

简单的问题。

将所有与控制器相关的方法(但不直接在视图中使用)放在帮助器中是不错的做法?

我的意思是,我的控制器仅由newcreateedit等方法组成。在这些方法中,通常有另一种方法,如:

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

最近我读过帮助器应该包含在视图中使用的方法,所以我不太确定上面的方法是否算得那样,因此我的方法放置是否是糟糕的做法。

有人可以向我指出考虑这种好/坏做法的相关文件吗?

1 个答案:

答案 0 :(得分:2)

这就是控制器关注的问题。它基本上是一个普通的红宝石模块,没有铁轨助手的任何附加含义。

# 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