我有一个精简的购物车应用程序,目前有一个型号“购物车”,购物车ID存储在一个会话中。
购物车控制器有这种方法所以我们总是有一个购物车
def initialize_cart
if session[:cart_id]
@cart = Cart.find(session[:cart_id])
else
@cart = Cart.create
session[:cart_id] = @cart.id
end
end
我的路线文件有这一行
map.resource :cart
我的购物车/展示视图看起来像这样,我已经添加了一个表单,以便最终我可以更新项目数量,但是现在我只是编辑created_at属性。
<% form_for(@cart) do |f| %>
<%= f.date_select :created_at %>
<p>
<%= f.submit 'Update' %>
</p>
<% end %>
<%= link_to 'Edit', edit_cart_path(@cart) %> |
<%= link_to 'Back', cart_path %>
最后,我的更新操作如下所示:
def update
#@cart = Cart.find(params[:id])
respond_to do |format|
if @cart.update_attributes(params[:cart])
format.html { redirect_to(cart_path) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @cart.errors, :status => :unprocessable_entity }
end
end
end
当我在“show”页面上对“created_at”属性进行更改时,该属性已成功更新,但是当我被重定向时,我会得到一个像这样的商业网址
http://192.168.0.10:3000/cart.%23%3Ccart:0x23d46fc%3E
我已经摆弄了更新操作,并且通过这样做可以完美地完成整个工作
# PUT /carts/1
# PUT /carts/1.xml
def update
#@cart = Cart.find(params[:id])
#respond_to do |format|
if @cart.update_attributes(params[:cart])
redirect_to(cart_path)
# head :ok
#else
# render :action => "edit"
# render :xml => @cart.errors, :status => :unprocessable_entity }
end
#end
它与respond_to块有关,导致它搞砸了,我真的很感激我能得到的任何帮助。
由于
答案 0 :(得分:1)
对于单一资源,您无需在路径中指定对象。
所以你应该使用它:
<%= link_to 'Edit', edit_cart_path %>
=====更新=====
我刚刚发现你的真正问题^^“(但原件也应该是真的)
您使用了form_for(@cart) do |f|
,它产生了那条丑陋的路径
请更改为form_for(@cart, :url => cart_path) do |f|
我不知道为什么,但它应该没问题......