在我的模特中,我有:
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?
....
所以我需要在控制器中设置ip
,user_agent
,text
等字段,我该怎么做?
现在我看到我的价值是零(为什么?
如何在控制器的帮助下设置rakismet_attrs值?
答案 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
这允许您从请求对象中分离垃圾邮件检查数据。