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

ip、、、などのuser_agentフィールドをコントローラーに設定する必要がありtextますが、どうすればこれを行うことができますか?

これで、値が nil であることがわかりました (なぜ?

コントローラーを使用して 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

これで、値が nil であることがわかりました (なぜ?

Rails 4 はデフォルトで強力なパラメーターを使用するため、値を呼び出すとarticle_comment_paramsnil になります。そのため、明示的にパラメーターを指定しないため、パラメーターは除外されます。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

article_comment_params に既にパーマリンクがあると仮定して、@nathanvda の回答を少しアップグレードします。

コントローラーで:

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 に答える