Доступ к экземпляру модели из контроллера другой модели - PullRequest
0 голосов
/ 01 августа 2010

У меня есть модель Thread, у которой есть страница show, и в коде этого действия у меня есть:

<%= render 'comments/form' %>

Как правильно инициализировать новый комментарий?Я пробовал:

  • @comment = @thread.comments.build(params[:comment]) в действии создания комментария и в коде представления формы комментария.
  • Вспомогательные методы потока и методы модели, называемые такими вещами, как this_thread.
  • Инициализация @comment в коде контроллера потока show.

Все эти попытки привели к нулевым ошибкам объекта или неопределенным ошибкам метода.


Inзаключение, какой путь мне следует выбрать?


Обновление

Чтобы уточнить,

  • Я создаю новый комментарий в контроллере потоков.@comment = @thread.comments.build
  • В комментарии create как мне получить доступ к @comment, созданному мной в контроллере потока?

Обновление # 2

Контроллер комментариев:

def create
  thread = Thread.find(params[:id])
  @comment = thread.comments.build(params[:thread])

  if @comment.save
  ...
end

выдает мне эту ошибку:

Couldn't find Thread without an ID

Знаете почему?Я предполагаю, что это как-то связано с params[:id] в качестве идентификатора комментария, а не идентификатора потока.Как же тогда получить идентификатор потока?Или, на какую магию Rails я забыл положиться, так как это отношения has_many / belongs_to.

1 Ответ

2 голосов
/ 01 августа 2010

Вы уверены, что Thread.new создает экземпляр вашей модели? В Ruby есть библиотека потоков, которая также определяет класс Thread - у вас может быть конфликт имен.

В комментарии создать действие, как мне получить доступ к @comment я создал в контроллер потока?

Технически, нет. Когда ваше представление публикуется в контроллере комментариев, необходимо создать новый объект, например, @comment = Comment.new(params[:comment]. Или, если вы извлекаете данные из БД, @comment = Comment.find(params[:id]). Обратите внимание, что build не сохраняет объект.

EDIT

Чтобы получить поток в контроллере, у вас есть два варианта. Один из способов - передать его как часть опубликованной формы (обычно используя скрытое поле).

Лучший способ - использовать вложенные маршруты и позволить Rails сделать всю работу за вас. Если у вас есть маршрут как:

map.resources :spools do |spools|
  spools.resources :comments
end

Затем в контроллере комментариев вы получите spool_id в хэше params. Путь будет выглядеть так для существующих комментариев:

/spools/1/comments/2

и вот так для новых комментариев

/spools/1/comments/

Где params[:spool_id] установлено на 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...