2015-05-23 5 views
0

ОБНОВЛЕНО СНОВА Я модифицировал приложение, чтобы обрабатывать форму для каждой записи настройки. Форма отправляет в/Настройки с помощью метода: put и зацикливается в блоке транзакций.Ruby on Rails 4 - Модель для настройки Rails.configuration

Вот мой код:

# 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» на «Минимальная длина заголовка элемента» ... Я не знаю, нормально это или нет.

Я не могу проверить каждую запись в модели таким образом, чтобы она соответствовала всем параметрам.

И наконец (и это большой) проверка товара не работает. Он будет принимать значение из базы данных и работать как ожидалось, но после изменения значения через форму (и я проверил, что значение действительно изменилось), валидация придерживается старого номера. Через некоторое время он начинает использовать новый номер.

Должен быть более простой способ сделать все это? Возможно, мне нужно изменить миграцию, чтобы каждый параметр был его собственным столбцом? Выполнение этого исправляет мою форму и цикл транзакций, которые я должен выполнять в своем контроллере. Но в конце дня проверка в статье не изменяется с обновлением базы данных, и я не знаю почему.

Еще раз спасибо за руководство по этому вопросу.

ОБНОВЛЕНО Благодаря комментариев @Frederick Cheung, я считаю, что это может быть лучше пойти с записью базы данных для настройки. Это создает две проблемы: Я хочу, чтобы страница индекса настроек отображала все настройки и разрешала редактировать и отправлять сообщения с этой страницы.

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

Также как вы рекомендуете хранить это в базе данных? Я играл с миграцией, и я могу либо сделать каждый столбец другой настройкой приложения. Или я могу сделать каждую установку строки.

Еще раз спасибо за помощь; Я надеюсь, что это все клики в ближайшее время.

Предыдущее сообщение:

У меня есть совершенно новые рельсы проект с «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 %> 

Проблему Может быть, я неправильно настройка вещи, но ...:

  1. Я не могу определить, как настроить вид так PARAMS отправляется указать как «статью» , "валидация" и "title_length_min".
  2. Я не знаю, как заставить элемент управления правильно проанализировать параметры. Он получает параметры, но я не знаю, что с ними делать, поскольку я не могу выполнять обычные настройки.find и Setting.update (params.require (: something,: somethingelse)
  3. Я чувствую, что должно быть модель для настройки этих пользовательских конфигураций, но я в недоумении о том, с чего начать, чтобы сделать эту работу
+0

Я не думаю, что это сработает (например, такие изменения не будут сохраняться). Я бы пересмотрел подход к базе данных –

+0

У вас есть точка зрения, я как бы забыл проблему персистентности ... Если я использую подход к базе данных, я могу отправлять только одну настройку за один раз. Подумайте о любой странице конфигурации любого приложения. На одной странице обычно несколько вариантов. Когда вы нажимаете «Сохранить», все эти параметры сохраняются. Я обновлю свой вопрос, чтобы отразить это новое направление мышления. Спасибо. – Bil1

+0

Любое редактирование нескольких настроек одновременно или сохранение нескольких настроек в одном объекте должно быть возможно. –

ответ

1

я сделать что-то вроде этого:.

класс Установка < 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 

вызов настроек i nt вид как:

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

Это полезно, но как вы гарантируете, что 5 настроек, которые обновляются одновременно, не записывают первые 4 и не выходят из пятого? Кроме того, ваша миграция для таблицы настроек выглядит примерно так: name => 'string': value => 'string'? – Bil1

+0

Я бы добавил метод к классу настроек, чтобы принять 5 параметров в качестве хэша и обернуть его в ActiveSupport :: Transaction, чтобы он успел на всех или откат. Я могу опубликовать миграцию, если вы заинтересованы. – errata

+0

Да, это может сработать. У меня много трудностей, обертывающих голову, как все это делать. Я знаю всех директоров, но синтаксис отбрасывает меня. Любой пример кода, который вы можете предоставить, может заставить меня идти. благодаря – Bil1

Смежные вопросы