【问题标题】:Set model variables in controller在控制器中设置模型变量
【发布时间】:2014-04-12 12:11:16
【问题描述】:

在我的模型中,我有:

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

【问题讨论】:

  • raksimet 文档建议它会自动从当前请求中获取 ip 等。
  • @FrederickCheung 我必须在控制器中设置它,因为它想从数据库中获取它(如评论文本等)

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


【解决方案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 环境。

【讨论】:

  • ... 到一个列,使用 self.column_name... 我在模型中没有它!
  • 我在评论模型中没有电子邮件等
  • 不是全部,因为我没有全部,我也可以有用户guest,它没有存储在模型中
  • 有些专栏会来自您的user,所以我稍微调整了答案。
  • @nathanvda,很抱歉接受您的采访。但是你能看看我失败的代码吗? stackoverflow.com/questions/24217458/…
【解决方案2】:

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

当您调用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 值?

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

【讨论】:

  • 这并不完全适用。 remote_ipuser_agentreferrer 不是从参数设置的,而是从请求环境设置的。所以这不是一个强参数问题。
【解决方案3】:

@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

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

【讨论】:

  • 电子邮件等 - 我在模型中没有这样的字段
  • 这些字段是否在关联的用户模型上?如果是,您可以委托给他们,即:apidock.com/rails/v4.0.2/Module/delegate 委托 :email, :username, to: :user
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多