如何为rails-settings gem创建设置配置页面?

Tim*_*ord 7 ruby-on-rails-3

我刚刚发现了rails-settings gem,现在我需要创建一个管理页面,让我可以编辑设置值.如何使用可以更改这些动态应用程序范围设置的编辑视图创建设置控制器?

kur*_*749 5

我没有使用过这个宝石,但它似乎应该是相当直接的.由于它使用数据库支持的模型,您只需按正常方式创建控制器:

rails g controller Settings
Run Code Online (Sandbox Code Playgroud)

从这里开始,您将定义索引操作以收集您在视图中显示的所有个人设置:

def index
  @settings = Settings.all
end
Run Code Online (Sandbox Code Playgroud)

然后在视图中,您可以设置一个循环来显示它们:

<% @settings.each do |setting| %>
  <%= setting.var %> = <%= setting.value %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

至于编辑......这可能有点棘手,因为默认情况下,rails会指望您一次只提交一个设置进行编辑.你可以这样做,但除非用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 %>
Run Code Online (Sandbox Code Playgroud)

这应输出所有设置(假设它们已分配给@settings变量),var名称作为标签,当前值作为文本字段值.假设设置了路由,当您提交此表单时,接收它的操作应该是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
Run Code Online (Sandbox Code Playgroud)

这可能不是最佳方式,具体取决于您编辑设置的频率和您拥有的设置数量......但这是一种可能的解决方案.