1

在我的模型中,我有:

class ArticleComment < ActiveRecord::Base
  include Rakismet::Model

  validates :text, :presence => true

  belongs_to :article
  belongs_to :user

  comment, permalink, request, username, email, text, remote_ip, 
      user_agent, referrer = nil

  def init_sp(comment_, permalink_, request_, username_, email_, text_)
    comment, permalink, request, username, email, text =
        comment_, permalink_, request_, username, email_, text_
    remote_ip = request_.remote_ip
    user_agent = request_.env["HTTP_USER_AGENT"], 
    referrer = request_.env["HTTP_REFERER"]
  end

  rakismet_attrs author: username, author_url: permalink, author_email: email, 
      content:  text, permalink: permalink, user_ip: remote_ip, 
      user_agent: user_agent, referrer: referrer
  binding.pry
end

在控制器中:

def create
  @article_comment = ArticleComment.new(article_comment_params)
  @spam = @article_comment.init_sp(@article_comment, params[:permalink], 
      request, username, email, article_comment_params[:text])

  if !@article_comment.spam?
  ....

所以我需要在控制器中设置字段 like ip, user_agent,text我该怎么做?

现在我看到我的价值为零(为什么?

如何在控制器的帮助下设置 rakismet_attrs 值?

4

3 回答 3

1

一些小提示:

  • 在模型中,如果要将某些内容保存到列中,请使用self.column_name
  • 您不必传递所有字段,因为您正在处理一个已经使用正确设置的所有列初始化的实例

所以你的模型应该如下所示:

class ArticleComment < ActiveRecord::Base
  include Rakismet::Model

  validates :text, :presence => true

  belongs_to :article
  belongs_to :user


  def init_sp(permalink, request)
    self.permalink = permalink
    self.remote_ip = request_.remote_ip
    self.user_agent = request_.env["HTTP_USER_AGENT"], 
    self.referrer = request_.env["HTTP_REFERER"]
  end

  rakismet_attrs author: user.name, author_url: user.permalink, author_email: user.email, 
      content:  text, permalink: permalink, user_ip: remote_ip, 
      user_agent: user_agent, referrer: referrer
end    

在您的控制器中,只需编写

def create
  @article_comment = ArticleComment.new(article_comment_params)
  @article_comment.init_sp(params[:permalink], request)

  if !@article_comment.spam?
    ...

另请注意,根据文档,您不需要存储请求环境参数,如果您.spam?在控制器方法内部调用(就像您已经这样做的那样),它可以request自行访问环境。

于 2014-04-23T10:53:55.043 回答
0

现在我看到我的价值为零(为什么?

当你调用article_comment_params这些值为 nil 时,因为 Rails 4 默认使用强参数,所以参数被过滤掉了,因为你没有明确地显示permit它们。

在该方法中article_comment_params,您需要明确允许您希望通过控制器 列入白名单/允许的每个参数。

更改您的article_comment_params方法以包含该permit方法:

def article_comment_params
  params.require(:article_comment).permit(:comment, :permalink, :request, :username, :email, :text)
end

我不确切知道您想要允许哪些参数,因此请确保您浏览列表并包含您需要的每个参数。

如何在控制器的帮助下设置 rakismet_attrs 值?

当您使用上述方法将参数列入白名单时,应该解决此问题的困难。

于 2014-04-20T05:48:11.540 回答
0

@nathanvda 答案的小升级,还假设您已经在 article_comment_params 中有永久链接:

在控制器中:

def create

  @article_comment = ArticleComment.new(article_comment_params)
  @article_comment.spam_check_data = spam_check_data_from_request

  if !@article_comment.spam?
  ...

private
  def spam_check_data_from_request
    { 
      remote_ip: request.remote_id,
      user_agent: request.env["HTTP_USER_AGENT"],
      referrer: request.env["HTTP_REFERER"]
    }
  end

在模型中

class ArticleComment < ActiveRecord::Base
    include Rakismet::Model

    validates :text, :presence => true

    belongs_to :article
    belongs_to :user

    def spam_check_data=(data)
      self.remote_ip = data[:remote_id]
      self.user_agent = data[:user_agent]
      self.referrer = data[:referrer]
    end

    rakismet_attrs author: username, author_url: permalink, author_email: email, 
      content:  text, permalink: permalink, user_ip: remote_ip, 
      user_agent: user_agent, referrer: referrer
end

这允许您将垃圾邮件检查数据与请求对象分离。

于 2014-04-26T12:21:21.450 回答