何か:
class C
@a = 11
end
はC
のインスタンスの@a
という名前のインスタンス変数を作成しませありません。 @a = 11
を押すと、がクラスそのものになるので、@a
はオブジェクトC
のインスタンス変数になります。あなたはirb
に上記入れるとC.instance_variables
を見れば、あなたはこの表示されます。
>> C.instance_variables
=> [:a]
をしかし、あなたはC
のインスタンスを見ると:また
>> C.new.instance_variables
=> []
、インスタンス変数は、自動的に最初に作成され使用し、nil
に初期化されます。
上記を組み合わせると、クラスオブジェクトMicropostController
には@reply_regex
インスタンス変数があり、インスタンスには含まれていないことがわかります。 def create
はインスタンスメソッドなので、@reply_regex
インスタンス変数を使用します。 MicropostController
オブジェクトのインスタンス変数として@reply_regex
がないため、if
ステートメント内にnil
という名前で作成され、初期化されます。
if @micropost.content =~ nil
と@micropost.content =~ nil
nil
はブールコンテキストではfalseで、if
ブロックが入力されることはありませんし、@micropost.in_reply_to
に値が割り当てられることはありませんから、nil
に評価します:結果は、あなたのif
が、このされて終わるということです。
あなたの正規表現のためのクラス変数を使用することができます。私は、脇として
REPLY_REGEX = /(\[email protected][^@ ]+(@)\w+(\.[a-z]{2,3}){1,2}.*\z)/i
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.content =~ REPLY_REGEX
#...
:クラス変数として
@@reply_regex = /(\[email protected][^@ ]+(@)\w+(\.[a-z]{2,3}){1,2}.*\z)/i
def create
@micropost = current_user.microposts.build(params[:micropost])
if @micropost.content =~ @@reply_regex
#...
が良く、ちょうど定数を使用して、インスタンスメソッドに表示されていますか返信先チェックをモデルに移すべきだと思います。あなたはcontent
内の任意の先頭と末尾の空白を取り除くためにbefore_validation
コールバックを使用して抽出し、返信先を救うことができる:
class Micropost < ActiveRecord::Base
before_validate :process_content, :if => :content_changed?
#...
private
def process_content
# Strip leading/trailing whitespace from self.content
# Extract the reply-to from self.content and save it in self.in_reply_to
end
end
ここでの利点は、コンテンツがあなたのコントローラを経由することなく変更または作成された場合(マイグレーション、手作業によるRailsコンソール、ユーザーに何かを通知しているシステムタスクなど)でも、すべての作業は完了です。
どのようなテストフレームワークを使用していますか? –
ユーザーは投稿をどのように入力していますか?リッチエディターの場合は、パラメーターをHTMLにする可能性が高くなります。 @ micropost.contentに何が含まれているかを確認するためにログに記録してみてください。初めのちょうど1つのスペースが今のようにあなたのロジックを台無しにするでしょう。 – froderik
@froderik: '@ micropost.content'が何を含んでいるかは関係ありません。' @ reply_regex'は 'nil'、' x =〜nil'はfalseになります。 –