2011-08-09 58 views

回答

6

我沒有使用這個寶石,但它似乎應該是相當直接。由於它採用了數據庫備份模式,您只需創建一個控制器正常:

rails g controller Settings 

在這裏,您將定義您的索引操作來收集你的所有個人設置在視圖中顯示:

def index 
    @settings = Settings.all 
end 

然後在視圖中,可以設置一個循環來顯示他們:

<% @settings.each do |setting| %> 
    <%= setting.var %> = <%= setting.value %> 
<% end %> 

至於編輯...這可能是有點棘手,因爲在默認情況下軌會希望你提交一個設置搜索g一次編輯。你可以這樣做,但除非你用ajax實現編輯,否則它可能是乏味和非直觀的。

另一種方法是將您的更新方法設置爲一次接受所有單個設置,循環並使用新值更新每個設置。它可能是這個樣子:

// The /settings route would need to be setup manually since it is without an id (the default) 
<%= form_tag("/settings", :method => "put") do %> 
    <% @settings.each do |setting| %> 
    <%= label_tag(setting.var, setting.var) %> 
    <%= text_field_tag(setting.var, :value => setting.value) %> 
    <% end %> 
    <%= submit_tag("Save Changes") %> 
<% end %> 

這應該輸出的所有設置(因爲它們已經被分配到@settings變量)與變數名稱作爲標籤和電流值作爲文本字段值。假設路由設置完成,當你提交這個表單時,接收它的動作應該包含params變量中的所有新設置。然後,你可以做這樣的事情在行動:

def update 
    params.each_pair do |setting, value| 
    eval("Settings.#{setting} = #{value}") 
    end 
    redirect_to settings_path, :notice => 'Settings updated' # Redirect to the settings index 
end 

這可能不是取決於你如何經常編輯設置,你有多少設置有最好的辦法......但是這是一個可能的解決方案。

+0

哇靠,EVAL是一個重大的標誌。如果你打算做這樣的事情,你可以使用'send',並且如果你打算這樣做,那麼應該在Settings模型中實現這種屬性設置細節。不要讓你的控制者看到模型的內部運作。 – unflores

2

我一直在尋找這方面的一些建議,並找到了對此非常簡單和優雅的另一個答案,對於任何後來尋找這個。它只是在您的模型中設置動態訪問器,允許您的表單具有與常規屬性相同的設置字段。一個例子可以在原來的答案中找到:

How to create a form for the rails-settings plugin