Рельсы, вопрос модели отношений - PullRequest
0 голосов
/ 12 ноября 2010

У меня есть следующее, которое прекрасно работает:

@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

1 Ответ

2 голосов
/ 12 ноября 2010

Сообщение об ошибке сообщает вам, что именно не так: 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
...