2011-04-11 61 views
0

所以,我有一些奇怪的控制器/視圖設置,編輯產品模型對象出現在列表控制器/視圖中。這是爲什麼這是一個冗長的解釋,但我離題了。但是,當我提交表單時,出現錯誤Couldn't find Product without an ID。是什麼賦予了?奇怪的是,當我查看與請求一起發送的參數時,ID屬性被分配給'格式'鍵。 ?!導軌形成故障

控制器代碼非常簡單。編輯動作:

def edit 
    @edit = Product.find(params[:id]) 
end 

更新操作:

def update 
    @edit = Product.find(params[:id]) 

    if @edit.save 
    redirect_to :url => listings_display_path 
    end 
end 

這裏是我的form_for代碼:

<% form_for @edit, :url => (listings_update_path(@edit)) do |f| %> 

編輯,跟蹤:

{"utf8"=>"âœ「", 
"_method"=>"put", 
"authenticity_token"=>"st17LW0S9uENaV8UBcxKUfRH67oo+r3TuFAxiPKMCEc=", 
"product"=>{"brand"=>"test_brand", 
"productname"=>"test_product", 
"category"=>"test_category", 
"regprice"=>"4", 
"saleprice"=>"2", 
"description"=>"description"}, 
"commit"=>"Submit", 
"format"=>"21"} 

編輯:routes.rb中

resources :product do 
    resources :promotions 
    collection do 
    get "replace" 
    end 
end 

#listings 
match 'listings/index' => 'listings#index' 
match 'listings/display' => 'listings#display' 
match 'listings/edit' => 'listings#edit' 
match 'listings/update' => 'listings#update' 

編輯:創建行動

def create 

    @product = Product.new(params[:product]) 
    @product.user = current_user 

    if @product.save 
    redirect_to :action => 'index' 
    end 
end 
+1

是什麼'listings_update_path'?它在哪裏領先?顯示此操作代碼。通常它是'update_litings_path'或甚至只有'listings_path'和'PUT'方法 – fl00r 2011-04-11 18:00:49

+0

這導致上面顯示的更新操作。耙路線告訴我這是'listings_update_path'.. – providence 2011-04-11 18:01:40

+1

爲什麼你不遵循約定路由和命名? – fl00r 2011-04-11 18:02:20

回答

0

試試這個

<%= form_for @edit, :url => listings_path(@edit), :html => {:method => :put} do |f| %> 
+0

我得到未定義的方法listing_path。將它切換爲listing_update_path會導致原始錯誤,無法在沒有ID的情況下找到產品。 – providence 2011-04-11 18:06:50

+1

如此顯示您的痕跡以查看您的問題 – fl00r 2011-04-11 18:08:23

+0

編輯爲包含痕跡 – providence 2011-04-11 18:09:37

1

首先,對於另一種方法在單個視圖編輯多個記錄,試試這個railscast:http://railscasts.com/episodes/198-edit-multiple-individually

其次,這是非常規的,但你的整個做法是非常規的...

您可以粘貼一個hidden field的形式與其中的ID。喜歡的東西:

<%= f.hidden_field, :product, :id %> 

然後檢查您的PARAMS哈希和ID將在那裏。您應該能夠使用類似的東西來訪問它的控制器:

# untested 
@edit = Product.find(params[:product][:id]) 

關閉我的頭頂,我不知道如何將其存儲在您的PARAMS哈希,但它會在那裏和你」將能夠像其他哈希屬性一樣訪問它。

祝你好運!

- 編輯 -

此外,關於你對缺乏彈性的評論在Rails的 - 有一件事我學到的是,Rails是不是呆板的,但它是高度針對特定約定優化。開發商將其稱爲是「固執己見」的軟件,這意味着:

  1. 它可以做任何事情,你在乎做你想要做的任何方式,但...
  2. 有幾乎總是一個「優先」的方式,更好,更快(更難更強大的笑)。

你會爲自己節省大量的時間和精力 - 可能會有很多樂趣 - 抓住Beginning Rails 3書。你可以在一個週末裏完成它,當你完成後,你會在「Rails方式」中有一個很好的入門,這將有助於你從「我不明白爲什麼Rails沒有這樣或那樣做」 「我瞭解Rails是如何工作的,以及通過遵循X模式來完成我想要做的事情是多麼容易」。無論如何,這就是我發生的事情。

再次祝你好運!

0

你需要修正它是一個單一的產品實例的路由有ID:

match 'listings/index' => 'listings#index' 
match 'listings/:id/display' => 'listings#display' 
match 'listings/:id/edit' => 'listings#edit' 
match 'listings/:id/update' => 'listings#update' 
+0

是的,我試過在一個階段,但無濟於事。這只是我的路線文件的當前狀態。要顯示我嘗試過的所有內容,需要在StackOverflow – providence 2011-04-11 19:20:49

+0

上佔用整個服務器的硬盤驅動器並添加':as'選項。 'match'listings /:id/update'=>'listings#update',:as => listings_update' ... – fl00r 2011-04-11 19:22:09

+0

當我這樣做時,我沒有收到任何錯誤,但檢查數據庫顯示記錄是未更新。我試着添加:via =>'put',但是然後我得到一個未找到路由的錯誤。 – providence 2011-04-11 19:36:55