Rails的多个外键记录 - 未知操作

时间:2013-04-16 03:14:10

标签: ruby-on-rails

我正在开发一款允许用户评论单个“工作”的应用(想想博客文章)。模型中的关联如下:

class User < ActiveRecord::Base
  has_many :works  
  has_many :comments

class Work < ActiveRecord::Base
  belongs_to :user
  has_many :comments


class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
  belongs_to :work

在评论表中,记录包含以下字段:

ID 内容
USER_ID
created_at
的updated_at
work_id

在我的评论控制器中,我有以下创建操作:

def create
    @work = Work.find(params[:id])
    @comment = @work.comments.create(params[:comment])
    @comment.user = current_user
    if @comment.save
      #flash[:success] = "Post created!"
      redirect_to root_url
    else
      render 'activities'
    end
  end

我正在尝试将用户和工作与评论相关联,但是当我尝试创建评论时,我收到以下错误消息:

Unknown action

The action 'update' could not be found for CommentsController

我正在尝试使用以下StackOverflow答案作为指南,但解决方案对我不起作用: Multiple Foreign Keys for a Single Record in Rails 3?

修改 我在作品#show action:

上添加了评论表单
def show 
  @work = Work.find(params[:id])
  @comment = current_user.comments.create(params[:comment])
  @activities = PublicActivity::Activity.order("created_at DESC").where(trackable_type: "Work", trackable_id: @work).all
  @comments = @work.comments.order("created_at DESC").where(work_id: @work ).all 
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @work }
    end
  end

评论表格本身:

<%= form_for(@comment) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Post a comment!" %>
  </div>
  <%= f.submit "Post", class: "btn btn-small btn-primary" %>
<% end %>

我在评论控制器上也有一个更新方法:

def update
     @comment = current_user.comments.find(params[:id])
    if @comment.update_attributes(params[:comment])
      flash[:success] = "Comment updated"
      redirect_to @comment
    end
  end

2 个答案:

答案 0 :(得分:0)

错误消息显示:

The action 'update' could not be found for CommentsController

因此,问题是您的表单试图在update上调用CommentsController操作。这与将UserWork实例添加为外键无关。你的代码似乎是正确的。

答案 1 :(得分:0)

确保在show操作期间将注释持久保存到数据库中:

@comment = current_user.comments.create(params[:comment])

然后表单助手将构建更新表单而不是创建表单(因为模型已经存在):

<%= form_for(@comment) do |f| %>

如果所需操作是从显示页面发布评论创建,请尝试build显示操作中的评论:

@comment = current_user.comments.build(params[:comment])