我有一个我知道的应用
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字段之前将其保存到数据库中吗?
答案 0 :(得分:3)
你做错了是试图统一两个本质上不同的行动:新的和编辑。
params是从客户端获取的参数哈希值。
创建新对象时,params[:id]
留空,因为新创建的对象的id属性是服务器的责任,而不是客户端。
编辑现有对象时,params[:id]
不为空,因为该对象已存在于数据库中且具有ID。这里params[:id]
的含义是“请使用这些属性编辑具有id param [:id]的对象”。
在解释之后,当您在此行中创建新对象时:
@category = Category.find(params[:id])
因params[:id]
为空而失败。