Я пытался https://github.com/huacnlee/rails-settings-cached,, но это не работает, как описано. Очевидно, автор забыл упомянуть некоторые дополнительные настройки в описании использования драгоценного камня. Мне не удалось написать контроллер для настройки параметров.
Вместо этого мне удалось использовать https://github.com/paulca/configurable_engine - несмотря на некоторые незначительные проблемы, этот камень гораздо более разумен, чем rails-settings-cached
.
У драгоценного камня configurable_engine
есть недостаток: он имеет жестко запрограммированные маршруты, которые неясны и не удобны. Автор камня пообещал исправить его , но сказал, что в настоящее время у него нет на это времени.
Так что эту проблему легко решить, просто создав собственные маршруты. Вот мой код (добавлен, чтобы этот драгоценный камень действительно работал):
routes.rb
namespace :admin do
resources :configurables, only: [:index, :show, :edit, :update, :destroy]
end
админ / configurables_controller.rb
class Admin::ConfigurablesController < Admin::ApplicationController
# include the engine controller actions
include ConfigurableEngine::ConfigurablesController
before_action :set_configurable, only: [:show, :edit, :update, :destroy]
def index
@configurables = (Configurable.all.size > 0 ? Configurable.all : []) +
(Configurable.defaults.keys - Configurable.all.collect { |c| c.name })
end
def show
end
def edit
new = params[:new]
end
def new
respond_to do |format|
name = params[:name]
if name
@configurable = Configurable.create!(name: name, value: nil)
if @configurable
format.html { redirect_to edit_admin_configurable_path(@configurable, new: true), notice: 'The setting was successfully created.' }
else
format.html { redirect_to admin_configurables_url, notice: 'Failed to create the setting.' }
end
else
format.html { redirect_to admin_configurables_url, notice: 'The name of the new setting was not specified.' }
end
end
end
def update
respond_to do |format|
if @configurable.update(configurable_params)
format.html { redirect_to [:admin, @configurable], notice: 'The setting was successfully updated.' }
format.json { render :show, status: :ok, location: @configurable }
else
format.html { render :edit }
format.json { render json: @configurable.errors, status: :unprocessable_entity }
end
end
end
def destroy
@configurable.destroy
respond_to do |format|
format.html { redirect_to admin_configurables_url, notice: 'The setting was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_configurable
@configurable = Configurable.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def configurable_params
params.require(:configurable).permit(:name, :value)
end
end
index.html.erb
<h1 class="page-header">Settings</h1>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Name</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @configurables.each do |configurable| %>
<tr>
<% if configurable.try(:name) %>
<td><%= Configurable.defaults[configurable.name][:name]%></td>
<td></td>
<td><%= link_to 'Show', [:admin, configurable] %></td>
<td><%= link_to 'Edit', edit_admin_configurable_path(configurable) %></td>
<td><%= link_to 'Destroy', [:admin, configurable], method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% else %>
<td><%= Configurable.defaults[configurable][:name] %></td>
<td><%= link_to 'Create', new_admin_configurable_path(name: configurable) %></td>
<td colspan="3"></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
</div>
edit.html.erb
<h1>Editing <%= @new ? "new " : "" %>setting</h1>
<%= render 'form', configurable: @configurable %>
<%= link_to 'Show', [:admin, @configurable] %> |
<%= link_to 'Back', admin_configurables_path %>
show.html.erb
<p>
<strong>Name:</strong>
<%= Configurable.defaults[@configurable.name][:name] %>
</p>
<p>
<strong>Value:</strong>
<%= @configurable.value %>
</p>
<%= link_to 'Edit', edit_admin_configurable_path(@configurable) %> |
<%= link_to 'Back', admin_configurables_path %>
_form.html.erb
<%= form_for([:admin, configurable]) do |f| %>
<div class="field">
<%= f.label "Name" %>
<%= Configurable.defaults[@configurable.name][:name] %>
</div>
<div class="field">
<%= f.label "Value" %>
<%= f.text_area :value %>
</div>
<div class="actions">
<%= f.submit "Submit" %>
</div>
<% end %>
Из-за жестко закодированных маршрутов мой контроллер не полностью REST-совместим, но он довольно близок к. Мое действие new
фактически создает (хранится в базе данных) параметр (только для переопределения его значения в файле yml).
Таким образом, этот код, добавленный к коду описания гема, позволяет практически использовать изменяемые во время выполнения настройки RoR.
Драгоценный камень требует, чтобы вы заранее установили некоторые значения по умолчанию в файле yml, которые вы можете переопределить позже во время выполнения. Но вы не можете создать новый параметр во время выполнения (не-yml-файл-существующий), а только изменить существующий (в yml-файле), что вполне логично.
Или вы можете восстановить (во время выполнения) значение по умолчанию любого параметра (удалив его переопределенное значение, сохраненное в базе данных).
Этот код был проверен для работы с Rails 5.