【问题标题】:Rails form_for redirecting to different methodRails form_for 重定向到不同的方法
【发布时间】:2013-05-24 02:46:02
【问题描述】:

我正在开发一个购物车应用程序并且有一个订单模型。我在订单模型中添加了运输详细信息,包括carriertracking_numbership_date。我创建了一个名为updateshipping 的方法,以便在更新订单后进行不同的重定向。

我是 rails 新手,所以不确定保存后是否可以在 rails 中进行条件重定向,或者我是否应该创建自定义路由来访问 updateshipping 方法(我尝试过),或者正确答案是否为我应该创建一个新模型来保存运输详细信息。

我尝试通过updateshipping 方法将表单部分重定向到更新,但提交按钮不起作用。当我将鼠标悬停在提交按钮上时,网址不会出现。当我点击 Submit 时,它似乎重新加载了部分表单。如果我在form_for 中删除@order 之后的所有内容,它会正确转到更新订单/更新方法,所以我假设我的问题在form_for 行上(或者这首先是订单模型的一部分。 )

<%= form_for(@order, :url => shipment_path, :html => { :method => "put" }) do |f| %>

  <%= render 'shared/error_messages', object: f.object %>

  <%= f.label :carrier %>
  <%= f.text_field :carrier %>

  <%= f.label :tracking_number, "Tracking #" %>
  <%= f.text_field :tracking_number %>

  <div class="form-actions">
    <%= f.submit "Save changes", class: "btn btn-warning" %>
  </div>
<% end %>

订单控制器

def updateshipping
  raise params.inspect  (code to update the order will come later)
end

耙子路线

shipment        /shipmentdetails/:id(.:format)         orders#shipment_details
shipment PUT    /shipmentdetails/:id(.:format)         orders#updateshipping

routes.rb

match '/shipmentdetails/:id' => 'orders#shipment_details', :as => :shipment
match '/shipmentdetails/:id' => 'orders#updateshipping', :as => :shipment, via: :put

订单模型

class Order < ActiveRecord::Base
  attr_accessible :name, :address, :carrier, :tracking_number, :ship_date
  has_many :line_items, dependent: :destroy
  has_one :user
  has_one :shop

  validates :name, :address, presence: true
end

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我不确定为什么会这样,但我更改了链接到表单部分的路线。我改变了路线:

    match '/shipmentdetails/:id' => 'orders#shipment_details', :as => :shipment
    

    到:

    match '/shipmentdetails/:id/edit' => 'orders#shipment_details', :as => :edit_shipment
    

    也许它在 shipping_path 之间感到困惑,但我认为来自 form_for 的路径具有它应该知道使用以下路线的“put”方法:

    match '/shipmentdetails/:id' => 'orders#updateshipping', :as => :shipment, via: :put
    

    至于我最初尝试的form_for

    form_for(@order, :url => shipment_path, :html => { :method => "put" })
    

    它似乎像推荐的那样工作

    form_for(@order, :url => shipment_path(@order), :html => { :method => "put" })
    

    但我不确定使用 shipping_path(@order) 而不是仅使用 shipping_path 是否更好。

    【讨论】:

      【解决方案2】:

      试试:method =&gt; "put",而不是:html =&gt; { :method =&gt; "put" }

      【讨论】:

      • 我试过这个但结果相同。测试时,表单出现部分重新加载,因此它可能无法识别“放置”,与 route.rb 中的匹配问题?
      【解决方案3】:

      将 form_for 行改为:

      form_for(@order, :url => shipment_path(@order), :html => { :method => "put" })
      

      【讨论】:

      • 我试过这个,但它本身并没有解决问题。我认为问题可能是编辑路径和更新路径之间的混淆。一旦我修改了路线,我就可以使用上面表格的答案以及我原来的 form_for 来让它工作。我不确定哪个更可取。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      相关资源
      最近更新 更多