Ruby on Rails - Хранение конфигурации приложения - PullRequest
20 голосов
/ 24 января 2010

У меня относительно простое приложение на Rails, и я хотел бы сохранить различные параметры конфигурации, которые могут изменять пользователи-администраторы во время работы приложения, например, разрешать комментарии к публикациям или изменять формат отображения даты.

Я знаю, что могу хранить константы и т. Д. В файле environment.rb, однако они загружаются только после перезапуска сервера.

Есть ли альтернативное место, где я могу определить эту информацию или было бы лучше сохранить ее в базе данных?

Любой совет приветствуется.

Спасибо.

Ответы [ 7 ]

16 голосов
/ 07 ноября 2011

Вы можете использовать гем rails-settings-cached , который является веткой гема rails-settings (связан с Yi-Ru Lin в другом ответе).

После настройки вы сможете выполнять такие действия, как:

Setting.foo = 123
Setting.foo # returns 123

Вы также можете управлять настройками на моделях, например:

user.settings.color = :red
user.settings.color # returns :red
9 голосов
/ 24 января 2010

Вы можете использовать базу данных. Создайте отдельную таблицу «Настройки», в которой хранятся нужные параметры ключа / значения. Недостатком этого решения является снижение производительности (запросы к БД каждый раз, когда вам нужна настройка). Чтобы решить эту проблему, вы можете читать / писать через кеш, например «cache_money», или создать свой собственный, используя «Rails.cache»

4 голосов
/ 25 января 2010

Попробуйте посмотреть, это может быть то, что вам нужно.

http://github.com/ledermann/rails-settings

1 голос
/ 04 мая 2014

Для rails 4, если вы используете postgresql, вы можете использовать HStore , который похож на сериализуемый атрибут, но вы делаете с ним запросы SQL.

Для рельсов 3 вы можете использовать activerecord-postgres-hstore gem.

1 голос
/ 06 сентября 2010

Я сам некоторое время использовал app_config gem, но он не работает с rails 2.3.9 (и, вероятно, также с rails 3.x), поэтому я нашел этот блог , который упоминает rails-settings и конфигурации , rails-settings хранит значения в БД, но в конфигурации есть встроенные пространства имен. Я не пробовал их, но думаю, что переключусь на rails-settings.

Теперь я замечаю, что ветвь настроек рельсов, которую упоминает И-Ру Линь , кажется более функциональной, чем другие настройки рельсов

Ярл

1 голос
/ 24 января 2010

Лучший способ - использовать таблицу базы данных. Каждая строка должна содержать ключевое слово и значение. Simples.

0 голосов
/ 28 октября 2016

Я пытался 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...