简单的一个模型奇异资源路由问题

时间:2010-09-11 17:18:42

标签: ruby-on-rails session controller routes

我有一个精简的购物车应用程序,目前有一个型号“购物车”,购物车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块有关,导致它搞砸了,我真的很感激我能得到的任何帮助。

由于

1 个答案:

答案 0 :(得分:1)

对于单一资源,您无需在路径中指定对象。

所以你应该使用它:

<%= link_to 'Edit', edit_cart_path %>

=====更新=====

我刚刚发现你的真正问题^^“(但原件也应该是真的)

您使用了form_for(@cart) do |f|,它产生了那条丑陋的路径

请更改为form_for(@cart, :url => cart_path) do |f|

我不知道为什么,但它应该没问题......