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=]
- 我无法确定如何设置视图,因此发送参数以指定 "article"、"validation" 和 "title_length_min"。
- 我不知道如何让控件正确解析参数。它得到了参数,但我不知道如何处理它们,因为我不能做通常的 Setting.find 和 Setting.update(params.require(:something, :somethingelse)
- 我觉得应该有一个模型来配置这些自定义配置,但我不知道从哪里开始进行这项工作。
我这样做了:
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') %>
再次更新 我已经修改了应用程序来处理为每个设置条目构建一个表单。表单 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=]
- 我无法确定如何设置视图,因此发送参数以指定 "article"、"validation" 和 "title_length_min"。
- 我不知道如何让控件正确解析参数。它得到了参数,但我不知道如何处理它们,因为我不能做通常的 Setting.find 和 Setting.update(params.require(:something, :somethingelse)
- 我觉得应该有一个模型来配置这些自定义配置,但我不知道从哪里开始进行这项工作。
我这样做了:
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') %>