2014-02-20 80 views
5

假設我有一個功能trim_string(串),我想在我的Rails應用程序使用,在這兩個模型和控制器。如果我把它放在應用程序助手中,它會進入控制器。但通常情況下,模型中不需要應用程序助手。那麼你在哪裏放置了你想要在模型和控制器中使用的通用代碼?在Rails,放在哪裏有用的功能,這兩個控制器和模型

回答

5

在回答具體問題「在哪裏你把你想要在這兩個模型和控制器使用通用的代碼?」:

把它放在lib文件夾。 lib文件夾中的文件將被加載,其中的模塊將可用。

更詳細,使用問題的具體例子:

# lib/my_utilities.rb 

module MyUtilities 
    def trim_string(string) 
    do_something 
    end  
end 

然後在控制器或模型,你想要這個:

# models/foo.rb 

require 'my_utilities' 

class Foo < ActiveRecord::Base 
    include MyUtilities 

    def foo(a_string) 
    trim_string(a_string) 
    do_more_stuff 
    end 
end 

# controllers/foos_controller.rb 

require 'my_utilities' 

class FoosController < ApplicationController 

    include MyUtilities 

    def show 
    @foo = Foo.find(params[:id]) 
    @foo_name = trim_string(@foo.name) 
    end 
end 
1

它看起來像你想的有方法String類比「trim_string」函數更好地「修剪」自己,對吧?你不能使用strip方法嗎? http://www.ruby-doc.org/core-2.1.0/String.html#method-i-strip

您可以在一個初始化添加新方法的字符串類,請在此In Rails, how to add a new method to String class?

class String 
    def trim 
    do_something_and_return_that 
    end 

    def trim! 
    do_something_on_itself 
    end 
end 

這樣,你可以這樣做:

s = ' with spaces ' 
another_s = s.trim #trim and save to another 
s.trim! #trim itself 

但檢查String類,它看起來像你已經擁有你所需要的有

+0

我覺得猴子修補串給用戶的功能來操縱模型和控制器提供一個字符串,聽起來人非常極端。 –

+0

它看起來像一些函數綁定到字符串(名稱是trim_string !!),爲什麼沒有那個字符串類?我認爲這取決於OP的需求 – arieljuod

+0

所以,我聽到你在說什麼 - 但它只是一個操縱字符串的方法,並且我們不傾向於僅僅因爲一個方法操縱而進入猴子修補核心類的級別該類型的數據。如果存在更簡單的解決方案,通常認爲最好避免猴子修補核心類。在這種情況下,用戶只需要一種可用於控制器和模型的方法,這就是問題所在。因此,問題的正確答案是將這樣的共享方法放在lib中的模塊中,而不是習慣性地修改核心類。那是我的想法,但是ymmv。 –

相關問題