Ruby Rails 4 - 要调整的模型 Rails.configuration

Ruby on Rails 4 - Model to adjust Rails.configuration

再次更新 我已经修改了应用程序来处理为每个设置条目构建一个表单。表单 posts 到 /Settings 使用 :put 方法并在事务块中循环。

这是我的代码:

# settings_controller.rb
class SettingsController < ApplicationController
  def index
    @settings = Setting.all
  end

  def update
    Setting.transaction do
      params[:settings].each do |k, v|
        @setting = Setting.find(k)
        @setting.update(params.require(:settings)[k].permit(:value))
      end
    end
end

# settings/index.html.erb
<%= form_tag "/settings", :method => "put" do %>
    <table>
      <thead>
      <tr>
        <th>Setting</th>
        <th>Value</th>
      </tr>
      <tbody>
    <% @settings.each  do |setting| %>
        <tr>
        <%= fields_for "settings[]", setting do |sf| %>
            <td><%= sf.label :name, t(setting.name) %></td>
            <td><%= sf.text_field :value %></td>
        <% end %>
      </tr>
    <% end %>
      </tbody>
    </table>
    <%= submit_tag("Save Changes") %>
    <%= link_to 'back', articles_path %>
<% end %>

#models/article.rb
class Article < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  validates :title, presence: true,
            length: { minimum: (Setting.find_by_name("validation_article_title_length_min").value.to_i) }
end

我认为这不是执行此操作的好方法,原因如下: 因为它是多个记录的一部分,所以我不得不跳过箍来获取视图以呈现每个设置。我正在使用 i18n 翻译将 "validation_article_title_length_min" 的数据库名称翻译成 "Minimum Article Title Length"...我不知道这是否正常。

我无法以这种方式验证模型中的每条记录,具体到每项设置可能需要的内容。

最后(这是一个很大的问题)文章验证不起作用。它将接受来自数据库的值并按预期​​工作,但在通过表单更改值后(我验证值确实发生了变化),验证仍然使用旧数字。一段时间后,它开始使用新号码。

必须有一种更简单的方法来完成所有这些吗?也许我应该修改迁移,以便每个设置都是它自己的列?这样做会修复我的表单和我必须在控制器中执行的事务循环。 但最终文章中的验证并没有随着数据库更新而改变,我不知道为什么。

再次感谢您的指导。

已更新 感谢@Frederick Cheung 的评论,我相信最好使用数据库条目进行设置。这样做会带来两个问题: 我希望设置索引页面显示所有设置并允许从该页面进行编辑和 posting。

如果我有 5 个验证设置,单击 post 应该确保所有 5 个都有效,然后 post 将一个设置发送到数据库。

此外,您建议如何将其存储在数据库中?我玩过迁移,我可以让每一列成为不同的应用程序设置。或者我可以让每个设置成一行。

再次感谢您的帮助;我希望这一切都能尽快点击。

上一个Post:

我有一个全新的 rails 项目,其中包含来自 rails 站点的 "getting started" 教程。一切都按预期工作。

我的任务: 目前用户可以添加文章。文章标题必须大于 5 个字符。我想让这个数字成为环境配置变量。然后,我希望能够从网页上调整这个变量。

到目前为止我做了什么 我创建了一个设置资源。我尝试将设置作为单独的行保存到数据库中,但这意味着每个设置一次只能编辑一个。谷歌搜索后我发现可以在 config/article_valdiation.yml

中创建配置变量
default: &default
  title_length_min: 5

development:
  <<: *default
  bar: dev

test:
  <<: *default
  bar: test

然后在 config/environment.rb 我做了以下事情:

Rails.configuration.article = ActiveSupport::OrderedOptions.new()
Rails.configuration.article.validation = Rails.application.config_for(:article_validation).deep_symbolize_keys

我正在尝试创建类似 Rails.configuration.element.configcatagory[config_element]

的结构

这里是设置路由和视图。

# routes.rb
resources :settings do
    collection do
      put :update
      patch :update
    end
  end

# settings/index.html.erb
<% render plain: params[:setting].inspect %>
<h1>Application Settings</h1>
<%= form_tag("/settings", :method => "put") do %>
    <table>
      <thead>
      <tr>
        <th>Setting</th>
        <th>Value</th>
      </tr>
      </thead>
      <tbody>
        <tr>
          <td>Minimum Article Title Length</td>
          <td><%= text_field_tag('article[:title_length_min]', Rails.configuration.article.validation[:title_length_min])  %></td>
        </tr>
      </tbody>
    </table>
    <%= submit_tag("Save Changes") %>
    <%= link_to 'back', articles_path %>
<% end %>

问题 也许我配置不正确但是...:[=​​19=]

  1. 我无法确定如何设置视图,因此发送参数以指定 "article"、"validation" 和 "title_length_min"。
  2. 我不知道如何让控件正确解析参数。它得到了参数,但我不知道如何处理它们,因为我不能做通常的 Setting.find 和 Setting.update(params.require(:something, :somethingelse)
  3. 我觉得应该有一个模型来配置这些自定义配置,但我不知道从哪里开始进行这项工作。

我这样做了:

class 设置 < ActiveRecord::Base

  validates_uniqueness_of :name

  def self.get_by_name(name)
    s = Setting.where(:name => name).first
    unless Setting.where(:name => name).first.nil?
      if s.values.nil?
        s.value
      else
        s.values
      end
    end
  end 

  def self.set_by_name(name, val)
    if val.kind_of?(Array)
      Setting.where(:name => name).first.update_attribute('values', val)
    else
      Setting.where(:name => name).first.update_attribute('value', val)
    end
  end

end

在视图中调用设置,例如:

<%= Setting.get_by_name('site_name') %>