Rails - добавить метод в текстовое поле - PullRequest
0 голосов
/ 18 декабря 2011

Я пытаюсь запустить метод checkSwear для каждого текстового поля перед его отправкой ..

У меня в основном это: (урезанный)

<%= form_for(@profile) do |f| %>

  <div class="field">
    <%= f.label 'I love to ' %>&nbsp;
    <%= f.text_field :loveTo %>
  </div>
  <div class="field">
    <%= f.label 'I hate to ' %>&nbsp;
    <%= f.text_field :hateTo %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

В моем контроллере у меня есть:

  def checkSwear
    antiSwear.checkSwear(What goes here?)
  end

На маршрутах:

  match '/check' => 'profiles#checkSwear'

Любая помощь высоко ценится!

(checkSwear - это отдельная жемчужина; то есть отдельная проблема! Что здесь означает, какую переменную получают из формы, которая будет помещена через жемчужину контрольной одежды)

UPDATE:

Извините за верблюдов, я Java-разработчик, изучающий Rails и т. Д., Старые привычки сильно умирают. Это для проекта. Я должен был написать небольшой драгоценный камень, чтобы сделать некоторую рубиновую логику и применить ее к чему-то. Содержимое драгоценного камня:

module antiSwear

  @swearwords = ["f**k", "f***ing", "shit", "shitting", "lecturer"]
  @replacements = ["fornicate", "copulating", "poop", "pooping", "Jonathan"]

  def self.checkText(text)

    @swearwords.each do |swearword|
      if text.include?(swearword)
        index = @swearwords.index(swearword)
        replacement = @replacements[index]
        text.gsub(swearword, replacement)
      end
    end
    return text   
  end
end 

/

Ответы [ 3 ]

0 голосов
/ 18 декабря 2011

Вы делаете это как часть проверки?Вы можете сделать это одним из нескольких способов.Вы можете выполнить проверку перед сохранением с помощью пользовательского метода проверки или напрямую переопределить установщик.Я покажу вам подход пользовательской проверки:

class Profile < ActiveRecord::Base
  validate :clean_loveTo

  protected
  def clean_loveTo
    errors.add(:loveTo, "can't contain swears") if antiSwear.checkSwear(loveTo)
  end
end

Я предполагаю, что checkSwear возвращает логическое значение здесь.

0 голосов
/ 18 декабря 2011

Я бы использовал пересечение массивов, одним из которых является исходный текст, разбитый на слова, а затем добавьте замены в. Вы должны быть уверены, что между словами и их заменами есть соотношение 1: 1, в которомcase я бы предложил использовать хэш для вашего словаря (по совпадению, какие хэши иногда называют на других языках).

module antiSwear

  # var names changed for formatting
  @swears = ["f**k", "f***ing", "shit", "shitting", "lecturer"]
  @cleans = ["fornicate", "copulating", "poop", "pooping", "Jonathan"]

  def self.checkText(text)
    # array intersection. "which elements do they have in common?"
    bad = @swears & text.split # text.split = Array
    # replace swear[n] with clean[n]
    bad.each { |badword| text.gsub(/#{badword}/,@cleans[@swears.index(badword)] }
  end

end

Возможно, вам придется использовать ftz с text.split аргументами, если замена зависает на \n & \r материал.

0 голосов
/ 18 декабря 2011

Это действительно должно быть сделано при проверке модели.

class Profile < ActiveRecord::Base
  validate :deny_swearing

  private
  def deny_swearing
    if AntiSwear.check_swear(love_to) || AntiSwear.check_swear(hate_to)
      errors.add_to_base('Swearing is not allowed.')
    end
  end
end

Тем не менее, если вы настаиваете на том, чтобы это было в контроллере, вы можете проверить params[:profile][:love_to] и params[:profile][:hate_to], чтобы увидеть, что было отправлено.1006 *

PS В этом примере я использовал правильные соглашения об именах рубинов, поскольку мы не используем "camelCasing".

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