Rails - 将方法添加到文本字段

时间:2011-12-18 17:56:18

标签: ruby-on-rails ruby methods textfield

我正在尝试让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是一个独立的宝石;也就是一个单独的问题!这里的含义是指从表格中收到什么样的变量,通过checkwear宝石)

更新:

对不起,我是一名研究Rails等的Java开发人员,老习惯很难。这是一个项目。我应该写一个小宝石做一些ruby逻辑并将其应用于某些东西。宝石的内容是:

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 :(得分:0)

这应该在模型验证中完成。

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]以查看已提交的内容。

P.S。在这个例子中,我使用了正确的ruby命名约定,因为我们不使用“camelCasing”。

答案 1 :(得分:0)

您是否在验证过程中这样做?你可以通过以下几种方式之一做到这一点。您可以在保存之前运行检查,通过自定义验证方法或直接覆盖设置器。我在这里向您展示自定义验证方法:

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在这里返回一个布尔值。

答案 2 :(得分:0)

我在数组上使用交集,其中一个是分成单词的源文本,然后gsub替换。你必须确保单词和替换之间有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

如果替代品挂在text.split&amp;上,您可能需要使用\n参数。 \r东西。