1

我有倍數的形式在編輯視圖就像你可以看到下面:找不到[產品型號]沒有ID - Ruby on Rails的

查看

[email protected] do |post| 
    .form 
    = simple_form_for post, url: update_posts_path do |f| 
     = f.input :title 
     = f.submit 

後來,當我更新的任何窗體我得到這個錯誤'無法找到沒有ID的鍋'。你可以看到在控制器和文件航線這裏:

控制器

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 

routes文件

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]))正在返回一個零對象,那麼控制器無法更新它。有人能幫我一把嗎?

+0

你確定你的模型是'Posts',並在最後一個's'? – mdemolin

+0

謝謝,它是和錯誤,現在是單數。 – darkcode

回答

4

錯誤是:on => :collection部分。這允許在沒有ID的情況下調用該操作,因此params[:id]爲空。

:on => :collection通常用於索引,如具有一組記錄的操作,因此不需要id部分。

BTW:整個事情:

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

是多餘的,第一行:

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

告訴Rails需要的一切。

0

對於更新的動作使用的是:on => :collection但是你的要求放在/補丁請求,所以你會使用patch "update", :on => :member, :as => :update也使的form_for變化,按您的route.Use <%=simple_form_for post ,:url=> update_post_path(post) do |f| %>而不是url: update_posts_path

關於params.require(:posts).permit(:title)

  1. 第一個問題:您使用的是posts而不是post
  2. 第二個參數是:id缺失

您將使用params.require(:post).permit(:title,:id)代替params.require(:posts).permit(:title)