0

私はうまく機能する次のものを持っています:

@request_thread = current_user.request_threads.new(params[:request_thread])

そして、私はこれがうまく機能します:

@requestable = find_requestable
@request_thread = @requestable.request_threads.new(params[:request_thread])

しかし、2行目を次のように試してみると:

@request_thread = @requestable.current_user.request_threads.new(params[:request_thread])

current_user を使用すると、次のエラーが発生します。

NoMethodError (undefined method `current_user' for #<Photo:0x10f95c828>):
app/controllers/request_threads_controller.rb:52:in `create'
app/middleware/flash_session_cookie_middleware.rb:14:in `call'

私はここで何を台無しにしましたか?

ありがとう

更新 - find_requestable を使用

  # http://asciicasts.com/episodes/154-polymorphic-association
  def find_requestable  
    params.each do |name, value|  
      if name =~ /(.+)_id$/  
        return $1.classify.constantize.find(value)  
      end  
    end  
    nil  
  end
4

1 に答える 1

2

エラーメッセージは、何が間違っているかを正確に示しています。オブジェクトが何であれ、current_user存在しません。@requestable

current_userから継承された関数である可能性が最も高いApplicationControllerか、少なくとも通常はそこにあります。通常、現在のセッションに従って User オブジェクトを返します。しかし、これは Rails の組み込み部分ではないため、詳細を知りたい場合は、さらに情報が必要です。

@requestableポリモーフィック モデル インスタンスのように見えるため、現在のセッションを認識しません。


ここでちょっとした Rails の魔法が起こって、あなたを混乱させていると思います。

@requestable.request_threadsとは両方とも、current_user.request_threadsこれらのオブジェクトに対して Rails によって生成されたヘルパー関数であり、結果をフィルタリングして値を自動的に入力することで時間を節約します。

あなたがこれまでに示したコードから、あなたは自分が作成current_userしている新しいものと関連付けようとしていると思います。request_threadその場合、それを手動で属性に簡単にマージできます。あなたのモデルがどのように見えるかわからないので、フィールド名から推測することしかできません:

@request_thread = @requestable.request_threads.new( params[:request_thread].merge(:user => current_user) )

私が言ったように、連鎖可能な関数は単に便宜上のものです。たとえば、代わりに次のように書くこともできます。

@request_thread = request_thread.new(params[:request_thread])
@request_thread.requestable = find_requestable
@request_thread.user = current_user
于 2010-11-12T01:12:16.020 に答える