4

我有一个我知道的应用程序

def new 
    respond_to do |format|
      format.html { new_or_edit }
      format.js { 
        @category = Category.new
      }
    end  
end

当我点击一个链接时被调用。

这导致 new_or_edit 被调用(在同一个文件中定义)。

  def new_or_edit
    @categories = Category.find(:all)
    @category = Category.find(params[:id])
    @category.attributes = params[:category]
    if request.post?
      respond_to do |format|
        format.html { save_category }
        format.js do 
          @category.save
          @article = Article.new
          @article.categories << @category
          return render(:partial => 'admin/content/categories')
        end
      end
      return
    end
    render 'new'
  end

经过一些测试,我发现每次执行都停止在

@category = Category.find(params[:id])

出现错误“找不到没有 ID 的类别”。当我打印出来时,Params 没有 :id 哈希。这是因为我必须在创建默认 :id 字段之前将其保存到数据库中吗?

4

1 回答 1

3

您做错的事情是试图统一两个本质上不同的操作:新建和编辑。

params 是您从客户端获得的参数的哈希值。

当您创建一个新对象时,params[:id]将其留空,因为新创建的对象的 id 属性是服务器的职责,而不是客户端的职责。

当您编辑现有对象时,params[:id]它不为空,因为该对象已存在于数据库中并具有一个 id。这里的意思params[:id]是“请使用这些属性编辑带有 id param[:id] 的对象”。

在解释了这一点之后,当你创建一个对象时,这一行:

@category = Category.find(params[:id])

失败,因为params[:id]是空的。

于 2012-10-21T06:30:46.470 回答