2017-01-13 2 views
0

У меня есть самореферентная модель Post для вложенных цепочек. Родительский пост отображает дочерние сообщения с частицами _post и _form. Каждый пост имеет типичные грубые действия для «ответа», «редактирования» и «удаления».UrlGenerationError в самонаводящейся модели

Задача: Действия редактирования дочерних ответов вызывают ошибку «UrlGenerationError Missing Required Keys [: id]», хотя параметр ID присутствует в запросе. Однако действие удаления работает нормально, и все действия отлично работают в родительском сообщении.

screenshot of a parent post and two nested child posts

post.rb:

has_many :child_posts, class_name: "Post", foreign_key: "parent_post_id" 
belongs_to :parent_post, class_name: "Post", optional: true 

routes.rb:

resources :posts 

_post.html.erb:

<%= link_to 'Edit', edit_post_path(post.id), ... %> 

_form.html.erb: (Ошибка возникает на <%= form_for post do |f| %> тег)

<% puts params.inspect # -> <ActionController::Parameters {"controller"=>"posts", "action"=>"edit", "id"=>"123"} permitted: false> %> 
<%= form_for post do |f| %> 
... 

Днем, чтобы показать больше -. Это только кажется наиболее уместным. Мысли?

+1

Входящие параметры и URL-адрес формы не имеют ничего общего друг с другом. Вы неправильно рассматриваете проблему. Реальная проблема заключается в том, почему хелпер маршрута терпит неудачу. Что проверяет «сообщение»? Вы переопределяете 'to_param' в своей модели. Что говорит 'polymorphic_url (post)'? – max

+0

Я предполагаю, что наиболее вероятная причина - это всего лишь типографская ошибка. Возможно, вы должны использовать переменную экземпляра '@ post', а не локальную переменную' post'. – max

+0

polymorphic_url (post) обнаруживает ту же ошибку, но это побудило меня осознать, что это связано с конфликтом, который я представил с помощью has_permalink gem, пытаясь поддерживать как постоянные ссылки (для оригинальных сообщений), так и номера идентификаторов (для ответов). Очевидно, я должен думать о лучшем решении. –

ответ

0

Это было вызвано конфликтом, который я представил с драгоценным камнем has_permalink. (Драгоценный камень работает по назначению)