полиморфная ассоциация без вложенных маршрутов - PullRequest
0 голосов
/ 06 марта 2012

У меня есть 2 модели статей и форумы, которые имеют полиморфную ассоциацию с моделью комментариев.

Я использую простые маршруты следующим образом.

rout.rb :

resources :articles 
resources :comments
resources :forums 

Ниже приведен мой код модели для статьи и форума :

has_many :comments, :as => :commentable,:dependent => :destroy

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

belongs_to :commentable, :polymorphic => true

теперь, когда я ввожу http://localhost:3000/articles/10

показывает содержание статьи и ниже, что предыдущие комментарии к этой статье, и текстовую область, чтобы дать новые комментарии, но когда я нажимаю на создание комментариев, он переходит на этот URL http://localhost:3000/comments, и я получаю следующую ошибку

undefined method `comments' for nil:NilClass

следующий мой код контроллера комментариев :

def create
  @commentable = find_commentable
  @comment = @commentable.comments.new(params[:comment])

  if @comment.save
    flash[:notice] = "Successfully saved comment."
    redirect_to(articles_url, :notice => 'Articlecmnt was successfully created.')
  else
    render :action => 'new'
  end
end

def new
  @comment = Comment.new 
end

def find_commentable
  params.each do |name, value|
    if name =~ /(.+)_id$/
      return $1.classify.constantize.find(value)
    end
  end
  nil
end

Ниже приведен мой index.html.erb код файла, который я отображаю в статьях и на форумах show.html.haml, используя = render :template=>"comments/index"

<% form_for [@commentable, Comment.new] do |form| %>

  <table>
    <tr>
      <td><%= form.text_area :commentcontent, :rows => 5 %></td>
      <td><%= form.hidden_field :user_id, :value => @current_user.id %></td>
    </tr>
    <tr><td><%= submit_tag "Add comment" %></td></tr>
  </table>

<% end %>

<ul id="comments">
  <% @comments.each do |comment| %>
  <li>
    <p>
      <b>Posted <%= time_ago_in_words(comment.created_at) %> ago</b>
    </p> 
    <%= comment.commentcontent %><b> by <%= @current_user.email %></b>
  </li>

  <% end %>
</ul>

как решить эту ошибку? Я думаю, что это не правильно article_id. как правильно написать commentable_id и commentable_type (статья или форум) при создании новых комментариев? Есть ли другой способ, кроме этого find_commentable?

заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 мая 2013

Это старый вопрос, но я думаю, что ошибка в том, что вы делаете @ commentable.comments.new, когда должно быть @ commentable.comments.build или в этом случае @ commentable.comments.create

0 голосов
/ 06 марта 2012

Метод find_commentable возвращает суффикс первого параметра на _id. Кажется, не работает в вашем случае. Почему бы не сделать простой User.find(params[:user_id])? Это проще и понятнее.

...