没有嵌套路由事件的多态关联

时间:2012-03-06 08:49:15

标签: ruby-on-rails ruby associations polymorphism

我有2个模型文章和论坛,它们与评论模型有多态关联。

我使用简单的路线如下。

routes.rb

resources :articles 
resources :comments
resources :forums 

以下是我的模型代码文章和论坛

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

评论模型

belongs_to :commentable, :polymorphic => true

现在我输入http://localhost:3000/articles/10

它显示了文章内容,下面是对此文章的先前评论以及textarea提供新评论,但是当我点击创建评论时,它会转到此网址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

以下是我使用show.html.haml

在文章和论坛= render :template=>"comments/index"中呈现的 index.html.erb 文件代码
<% 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_idcommentable_type(文章或论坛)?除此find_commentable之外还有其他方法吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

find_commentable方法返回_id的第一个params后缀。这似乎不适用于您的情况。为什么不做一个简单的User.find(params[:user_id])?它更简单,更易读。

答案 1 :(得分:0)

这是一个老问题,但我认为错误是因为你正在做@ commentable.comments.new应该是@ commentable.comments.build  或者在这种情况下@ commentable.comments.create