1

In my model I have:

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

and in controller:

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

So I need to set up field's like ip, user_agent, text in controller, how could I do this?

Now I see that my value's are nil ( why?

How to set rakismet_attrs value's with help of controller?

Ecnalyr
  • 5,792
  • 5
  • 43
  • 89
Valdis Azamaris
  • 1,433
  • 5
  • 22
  • 47

3 Answers3

1

Some small pointers:

  • in a model, if you want to save something to a column, use self.column_name
  • you do not have to pass all the fields, since you are working on an instance which is already initialised with all the columns set correctly

So your model should look as follows:

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    

And in your controller, just write

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

  if !@article_comment.spam?
    ...

Also note, that according to the documentation you do not need to store request environment parameters, if you call .spam? inside a controller method (as you already do) it can access the request environment by itself.

nathanvda
  • 49,707
  • 13
  • 117
  • 139
0

Now I see that my value's are nil ( why?

When you call article_comment_params the values are nil because Rails 4 uses strong parameters by default, so the parameters are filtered out because you do not explicitly permit them.

In the method article_comment_params you need to explicitly permit every parameter you want to whitelist / allow through the controller.

Change your article_comment_params method to include the permit method:

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

I don't know exactly what params you want to allow, so make sure you go through the list and include every parameter you need.

How to set rakismet_attrs value's with help of controller?

The difficulty with this issue should be resolved when you whitelist the parameters using the method described above.

Ecnalyr
  • 5,792
  • 5
  • 43
  • 89
  • This does not apply completely. `remote_ip`, `user_agent` and `referrer` are not set from the params, but from the request environment. So this is not a strong parameters problem. – nathanvda Apr 23 '14 at 10:55
0

Small upgrade on @nathanvda answer, also assuming you already have permalink in article_comment_params:

in controller:

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

in model

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

this allows you to decouple spam check data from the request object.

Krzysztof
  • 464
  • 2
  • 4