在控制器中设置模型变量

时间:2014-04-12 12:11:16

标签: ruby-on-rails ruby ruby-on-rails-4.1 akismet

在我的模特中,我有:

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?
  ....

所以我需要在控制器中设置ipuser_agenttext等字段,我该怎么做?

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

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

3 个答案:

答案 0 :(得分: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环境本身。

答案 1 :(得分:0)

  

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

当您致电article_comment_params时,值为零,因为Rails 4默认使用strong parameters,因此参数会被滤除,因为您没有明确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值?

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

答案 2 :(得分: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

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