Ho provato https://github.com/huacnlee/rails-settings-cached, ma non funziona come descritto. Ovviamente l'autore ha dimenticato di menzionare alcune ulteriori messe a punto nella descrizione dell'uso della gemma. Non sono riuscito a scrivere un controller per la manipolazione delle impostazioni.
Invece sono riuscito a utilizzare https://github.com/paulca/configurable_engine - nonostante alcuni problemi minori, questo gioiello è di gran lunga più ragionevole di rails-settings-cached
.
La gemma configurable_engine
ha uno svantaggio: ha le route codificate che sono oscure e non convenienti. L'autore della gemma promised to correct it, ma ha detto che al momento non ne ha avuto il tempo.
Quindi questo problema è stato facilmente organizzato semplicemente creando i miei percorsi. Qui è il mio codice (aggiunto per rendere questo gioiello veramente lavorare):
routes.rb
namespace :admin do
resources :configurables, only: [:index, :show, :edit, :update, :destroy]
end
admin/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 %>
causa della codificato duro instrada il mio controller non è completamente compatibile con REST, b è abbastanza vicino a L'azione new
crea effettivamente un'impostazione (memorizzata nel database) (solo per sovrascrivere il valore del file yml).
Quindi, questo codice aggiunto al codice descrizione della gemma consente di utilizzare praticamente le impostazioni RoR modificabili in fase di esecuzione.
La gemma richiede di impostare alcuni valori predefiniti in un file yml in anticipo, che è possibile sovrascrivere più avanti in fase di esecuzione. Ma non è possibile creare una nuova impostazione in fase di esecuzione (not-yml-file-existent) - modificare solo un file esistente (in file yml) - che è abbastanza logico.
Oppure è possibile ripristinare (in fase di esecuzione) il valore predefinito di qualsiasi impostazione (eliminando il valore sovrascritto del database memorizzato).
Questo codice è stato verificato per funzionare con Rails 5.
Ho appena postato una risposta con un approccio che mantiene le impostazioni nel database, le aggiorna secondo necessità e non subisce problemi di prestazioni senza ricorrere alla memorizzazione nella cache di cose DB. – silverdr