无法找到没有ID的[model] - Ruby on rails

时间:2014-02-08 17:55:58

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 simple-form

我在编辑视图中有多个表单,如下所示:

查看

-@posts.each do |post|
  .form
    = simple_form_for post, url: update_posts_path do |f|
      = f.input :title
      = f.submit

然后当我更新任何表格时,我收到此错误'找不到没有ID的Pots'。您可以在此处查看控制器和路径文件:

控制器

def update
  @post = Posts.find(params[:id]) //If I change it for Posts.first then is working
  if @post.update_attributes(params.require(:posts).permit(:title))
    redirect_to ....
  else
    flash[:notice] = "Sorry."
    render :edit
  end
end

路线档案

resources :posts, :only => [:index, :edit, :update] do
  get "edit", :on => :collection, :as => :edit
  patch "update", :on => :collection, :as => :update
end

我认为错误是由于某种原因(@ post = Posts.find(params [:id]))返回一个nil对象,然后控制器无法更新它。有人可以帮我一把吗?

2 个答案:

答案 0 :(得分:4)

错误是:on => :collection部分。这允许在没有id的情况下调用操作,因此params[:id]为空。

:on => :collection通常用于索引类似于一组记录的操作,因此不需要id部分。

顺便说一下:整件事:

get "edit", :on => :collection, :as => :edit
patch "update", :on => :collection, :as => :update

是多余的,第一行:

resources :posts, :only => [:index, :edit, :update]

告诉Rails它需要的一切。

答案 1 :(得分:0)

对于更新操作,您使用的是:on => :collection,但您的请求已被置/补丁请求,因此您将使用patch "update", :on => :member, :as => :update根据您的路线更改form_for。使用<%=simple_form_for post ,:url=> update_post_path(post) do |f| %>代替{ {1}}

关于url: update_posts_path

  1. 第一个问题:您使用params.require(:posts).permit(:title)代替posts
  2. 第二个参数post缺少
  3. 您将使用:id代替params.require(:post).permit(:title,:id)