2017-08-08 99 views
0

如果我有一個控制器如何將類中定義的變量傳遞給Rails表單?

class MyController < ApplicationController 
    vals = [...] 

    def new 
    ... 
    end 

    def create 
    if save 
     ... 
    else 
     render 'new' 
    end 
    end 

我怎樣才能使「丘壑」變量都可以訪問的方法呢?在我的「新」視圖中,我想使用「vals」變量作爲下拉菜單,但是rails會給我提供錯誤。當然,我可以將變量複製兩次,但這種解決方案不夠優雅。

回答

2

由於Sebastion提到before_ hook/callback是一種解決它的方法,但是正如你提到的那樣,它是一個下拉菜單,我猜它是一個不變的列表,如果是的話,我會建議使用常量來定義價值觀,或許是在他們特定的模型中,或者如果要在很多地方使用,PORO會很好地保持乾爽。那麼這也將讓您輕鬆訪問任何地方,例如在模型驗證檢查,或設置下拉菜單中的選項視圖,或者控制器,如果你願意的話:

class ExampleModel 
    DROPDOWN_VALUES = [...].freeze 

    validates :some_attr, inclusion: { in: DROPDOWN_VALUES } 
end 

class SomeController < ApplicationController 
    def new 
    # can call ExampleModel::DROPDOWN_VALUES here 
    end 

    def create 
    # also here, anywhere actually 
    end 
end 
2

你可以使用一個before_*回調,例如before_action,這樣你將你的丘壑變量作爲實例之一,並使其可用於您的新的和創建方法,是這樣的:

class SomeController < ApplicationController 
    before_action :set_vals, only: [:new, :create] 

    def new 
    ... 
    # @vals is available here 
    end 

    def create 
    if save 
     ... 
     # and here 
    else 
     render 'new' 
    end 
    end 

    private 

    def set_vals 
    @vals = [...] 
    end 
end 
-1

限定在相應model

例如:

class User < ActiveRecord::Base 

    TYPES = %w{ type1 type2 type3 } 

end 

和在烏爾形式使用像

User::TYPES 

=> ["type1", "type2", "type3"] 

您可以在應用程序的任何位置重複使用。

+0

這與我的答案有什麼不同?你沒有給出任何新的問題,只是提供了完全相同的解決方案作爲一個小時前已經給出的答案... –

+0

我認爲你編輯你的答案,我發佈我的意見如何直接使用,而無需傳遞到變量。所以只是不要亢奮。 :) –

+0

anser沒有被編輯過,冷卻不用擔心,只是指出這個答案沒有增加任何新東西,如果每個人都在相同的答案處處添加相同的答案,我們有一個不好的時間作爲一個社區。 –

1

與以前不同的方法(雖然可能只是在Sebastian的解決方案中只有實例方法是優選的),但是要利用以下事實:函數和局部變量在ruby中以相同的方式調用並寫入:

def vals 
    @vals ||= [...] 
end 

並且您應該可以在控制器(而不是視圖)上訪問它。如果你想在你的看法,以及你可以在控制器

helper_method :vals 

的開始打電話。如果你希望能夠修改使用瓦爾斯=「一些價值」丘壑

def vals= vals_value 
    @vals = vals_value 
end 

考慮可能在Sebastian的解決方案中使用intance變量的帳戶是首選,但如果您出於某種原因決定能夠在視圖上調用「vals」而不是「@vals」(例如,如果您使用send或嘗試),那麼這應該能夠爲你做到這一點。

相關問題