【问题标题】:form_for submit button does not work for ruby on railsform_for 提交按钮不适用于 ruby​​ on rails
【发布时间】:2015-07-19 18:03:34
【问题描述】:

我的 form_for 提交按钮只能部分工作;数据保存在数据库中,但重定向失败。以下是表单的相关代码:

app/views/orders/new.html.erb

<h1>Menu</h1>
<%= link_to "Back to channel", current_channel_path %>
<div class="container">
<table class="table table-striped">
    <thead>
      <tr>
        <th>Meal</th>
        <th>Price</th>
     </tr>        
   </thead>
<tbody>
  <% @menu_items.each do |t| %>
  <p>
    <tr>
      <td><%= t.name %></td>
      <td><%= number_to_currency(t.price) %></td>

      <%= form_for (@order), url: orders_path, remote: true do |f| %>
      <td><%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %></td>
      <%= f.hidden_field :meal, :value => t.name %>
      <%= f.hidden_field :unit_price, :value => t.price %>

      <td><%= f.submit "Order", class: "btn btn-primary" %></td>
      <% end %>
    </tr>
  </p>
  <% end %>
</tbody>
</div>

这是 routes.rb 的代码

Rails.application.routes.draw do
#For Orders
get 'orders' => 'orders#new'
post 'orders' => 'orders#create'
get 'all_orders' => 'orders#show'

resources :users
resources :orders 

这里是订单的相关代码

def new
  @menu_items = MenuItem.all
  @order = Order.new
end

def create 
  @order = current_channel.orders.build(order_params)
  @order.user = current_user

  if @order.save 
    flash.now[:success] = "Order has been recorded!"
    redirect_to all_orders_path
  else 
    flash.now[:danger] = "Order was not recorded!"
    render 'new'
  end 
end

我读到提交按钮可能无法工作,因为它嵌套在表格中。我尝试将表单放在表格之外,但提交仍然没有重定向;然而,在这两种情况下,提交按钮都会在订单数据库中创建记录。知道为什么会这样吗?提前感谢您的帮助!

【问题讨论】:

  • 重定向失败是什么意思?
  • 您正在发出 ajax 请求。你需要 create.js.erb 文件而不是重定向。
  • 错误信息有助于诊断
  • @Pavan 重定向失败,我的意思是我点击提交按钮后没有重定向到正确的页面,但数据记录在数据库中。
  • 你想被重定向到哪个?

标签: ruby-on-rails ruby forms submit form-for


【解决方案1】:

您需要为上面未列出的索引路径设置路由。如果您遵循标准的 crud 约定,您应该在您的路由文件中使用“resources :orders”,这将生成您需要的 post/put/delete/get 路由。然后您的重定向将起作用。

【讨论】:

  • 我确实将资源 :orders 放在了我的路线文件中,但它不起作用。
  • 它必须是“资源:订单”。通知资源是复数。此外,您必须将此路由移到您手动创建的其他路由之上,因为 rails 会查找第一个匹配的路由并执行。最后,在您的控制器中,您必须将 redirect_to “路径”更改为:redirect_to order_path(:id)。如果您想查看所有订单,而不仅仅是您创建的订单,您应该重定向到 orders_path
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多