我的代码正在跳过View并直接进入控制器。铁轨上的红宝石

时间:2016-04-05 13:31:06

标签: ruby-on-rails ruby ruby-on-rails-3.2

我的观点

<h1>Return a Book</h1>
<%= form_tag("/orders/returnB", method: "get") do %>
  <div class="form-group">
    <%= label_tag :ID, "ID" %>
    <%= text_field_tag :ID, nil, class: "form-control" %>
  </div>
  <%= submit_tag "Submit", class: "btn btn-default" %>
<% end %>

我的控制器

def returnB
  getid = params[:ID]
  @order = Order.find(getid)
  @order.destroy
  respond_to do |format|
    format.html { redirect_to orders_url, notice: 'Order was destroyed.' }
    format.json { head :no_content }
  end
end

它只是直接进入控制器,因为我的控制器无法获取id,因此它会出错。所以我在我的路线上这样做:

get 'orders/return' => 'orders#returnB'

2 个答案:

答案 0 :(得分:0)

在简单的rails流中,请求首先命中控制器,然后呈现与控制器名称相同的视图模板。

我认为您的表单已在

中定义
view/orders/returnB.erb

这就是为什么请求在呈现表单之前首先命中控制器的原因。我建议你将表单移动到其他视图模板中。

答案 1 :(得分:0)

将您的路线更改为:

delete 'orders/return' => 'orders#return_order'
应该使用

删除来销毁。

将表格更改为:

<h1>Return a Book</h1>
<%= form_tag("/orders/return", method: "delete") do %>
 <div class="form-group">
  <%= label_tag :ID, "ID" %>
  <%= text_field_tag :ID, nil, class: "form-control" %>
 </div>
<%= submit_tag "Submit", class: "btn btn-default" %>
<% end %>

将操作名称从returnB更改为return_order,因为它不是编写方法名称的正确惯例。

将控制器代码更改为:

def return_order
  @order = Order.find_by_id(params[:ID])
  @order.destroy
  respond_to do |format|
    format.html { redirect_to orders_url, notice: 'Order was destroyed.' }
    format.json { head :no_content }
  end
end