Controller 中使用 Private Method 和 Helper Method


#1

各位大大好,最近第一次開發 Rails 專案,我發現在 controller 中定義 private method,就可以直接在 controller 中呼叫使用

class UsersController < ApplicationController
  def test
      hello_world
  end

  private 
  def hello_world
    puts "Hello World!"
  end
end

但是我也可以把這些 method 放到 helper 中再呼叫

UsersHelper

module UsersHelper
  def hello_world
    puts "Hello World!"
  end
end

UsersController

class UsersController < ApplicationController
  include UsersHelper

  def test
     hello_world
  end
end

想請問這兩個哪個差異在哪?哪個是比較好的做法呢?


#2

… 是因為 Ruby 的 class 可以用 private method 而非 Rails 可以用,順序要換一下

private 的意思是自身能用而已,所以跨出去就無法分享,但 Rails helper 的語意本來就是分享用的,但 helper 的作用域應該是在 view 上,而非 controller,但 controller 的 method 可以宣告成 helper 類似使用

class UsersController < ApplicationController
  helper_method :sort_column
  def hello_world
    puts "Hello World!"
  end
end

所以依照一般 Rails process 的順序應該是

route => (controller + action) => (view + helper[+controller_helper])

但你卻把後面的搞到前面來,變成

route => (controller + helper + action) => (view + helper)

這樣不會對唄 … Orz"

& 你用的 include 是 Ruby 語法(事實上你用的所有的語法都是 Ruby 語法)所以不了解其真義就不要亂用哩,因為你可以把全世界的 class / module 都 include 進去,自己弄出核彈沒人能救你哩

我們 Youtube 上面有新手教學的影片,你可以參考先, & 不要因為 Rails 而 Rails,你會錯失另外一個天空


#3

喔喔,原來還有 helper_method 的用法,這樣我知道了

Google 了一下後找到 XDite 的文,也貼過來參考

非常感謝!


#4

的确可以这么使用,不过标准的推荐用法是 Helper 方法一般给 Views 使用。

单个 Controller 中使用的,在相同文件中定义 private 方法;

多个 Controller 中可以共用的,

定义在 ApplicationController,

或者

创建一个 Controllers/Concern/NameOfModule.rb 中

Module NameOfModule

  def do_something
  end
end

然后 Include 这个模块

Class SomeController < ApplicationController
  include NameOfModule
end

Class AnotherController < ApplicationController
  include NameOfModule
end

#5

原來 Controllers/Concern 是這樣用的

查找了一下資料,這篇開宗明義就表明了這個用法:

If you setup a Rails 4 app, you’ll notice the app/models/concerns and app/controllers/concerns directories. Concerns are modules that can be mixed into your models and controllers to share code between them.

感謝!