【问题标题】:Form_tag routing error after unsuccessful submit提交失败后form_tag路由错误
【发布时间】:2017-02-11 12:32:02
【问题描述】:

我有一个带有部分表单的索引页面,用于将新记录提交到包模型。我将此表单保留在索引页面中,因此用户在重复此操作多次时无需离开页面。 在同一页面中,我有一个 form_tag 用于同一控制器的多个更新,即 packages_controller。 一切正常,除了以下情况:当点击更新按钮时,转到表单而不是提交我返回(使用浏览器)并尝试选择其他要更新的记录然后我有一个路由错误:

Routing Error

没有路线匹配 [PUT] "/projects/47/orderlines/18/packages"

我的索引页面如下所示:

	<% if current_user %>	
		<%= render "packages/form" %>
	<% end %>

<% if @packages.count >= 1 %>

<table class="table table-striped">
  <thead>
    <tr>
		<th> <input type="checkbox" id="selectAll" value="selectAll"></th>
		<th>Packed </th>
      <th>#No.</th>
      <th>Type</th>
      <th>Gross weight</th>
      <th>Length</th>
      <th>Width</th>
      <th>Height</th>
	  <th></th>
	  <th>Container</th>
    </tr>
  </thead>
<%= form_tag edit_multiple_project_orderline_packages_path, method: :get do %>
  <tbody>
    <% for package in @packages %>
		<% if package.packed== true %>
		<% @label_type="success" %>
		<% else %>
		<% @label_type="default" %>
		<% end %>
		<tr>
		 <td><%= check_box_tag "package_ids[]", package.id %></td>
		 <td><span class="label label-<%= @label_type %>"><% if package.packed==true %>Packed<% else %>Unpacked<% end %></span></td>
        <td><%= package.package_no %></td>
        <td><%= package.package_type %></td>
        <td><%= package.gross_weight %></td>
        <td><%= package.length %></td>
        <td><%= package.width %></td>
        <td><%= package.height %></td>
		<% if @orderline.packages.count >= 1  %>
		<td><%= link_to 'Delete', [package.orderline.project, package.orderline, package],
									  method: :delete,
									 	data: { confirm: 'Are you sure?' } %></td>
	
		<td><%= @containers.find(package.container_id).container_id if package.packed %></td>				
		<% end %>
      </tr>
    <% end %>
  </tbody>
</table>
<%= submit_tag "Add to container", class: "btn btn-primary" %>
<% end %>
<br />

<%= will_paginate %>
<br>

还有 multiple_edit 表单

<div class="col-sm-4">
	<%= form_tag update_multiple_project_orderline_packages_path, method: :put do %>
		<ul>
			<% @packages.each do |package| %>
			<li>
				<%= hidden_field_tag "package_ids[]", package.id %>
				<%= package.package_no %>
				<%= package.container_id %>
					<% package.errors.full_messages.each do |msg| %>
					<li><%= msg %></li>
					<% end %>
			</li>
			<% end %>
		</ul>
		<%= fields_for :package do |f| %>
			<div class="field">
				<%= f.label :package_no %><br />
				<%= f.text_field :package_no, :class => "form-control" %>
			</div>
			<br />
			<div class="field">
				<%= f.label :container_id %><br />
				<%= select_tag 'package[container_id]', options_from_collection_for_select(@project.containers, 'id', 'container_id', default_blank: true), prompt: "- Select container -", :class => "form-control" %>
			</div>
			<br />
			<div class="field">
			      <%= f.label :packed %><br />
			      <%= f.select :packed, [["Packed", true], ["Unpacked", false]],{ prompt: "- Packing -"},{ :class => "form-control" } %>
			</div>
		<% end %>
		<div class="actions">
			<br />
			<%= submit_tag "Update", :class => "btn btn-primary" %>
		</div>
	<% end %>
</div>

以及包控制器edit_multiple 操作:

  
  def edit_multiple
    @project = Project.find(params[:project_id])
    @packages = Package.find(params[:package_ids])
  end
  
  def update_multiple
    @packages = Package.find(params[:package_ids])
    @packages.reject! do |package|
      package.update_attributes(package_params.reject { |k,v| v.blank? })
    end
    if @packages.empty?
      redirect_to project_orderline_packages_url
    else
      @package = Package.new(package_params)
      render "edit_multiple"
    end
  end

packages_controller 创建动作:

def create
    project = Project.find(params[:project_id])
    orderline = project.orderlines.find(params[:orderline_id])
      @package = orderline.packages.new(package_params)
      @package.save
    
    
    if @package.save
      flash[:success] = "Package(s) was successfully added."
      redirect_to :back
    else
      render 'new'
    end

还有我的路线:

resources :projects do
  resources :containers
  resources :orderlines do
     resources :packages do 
       collection do 
         put :packed
         get :edit_multiple
         put :update_multiple
       end
     end
   end
end

我刚刚在这里添加了我的路线:

  • edit_multiple_project_orderline_packages_path GET /projects/:project_id/orderlines/:orderline_id/packages/edit_multiple(.:format) 包#edit_multiple update_multiple_project_orderline_packages_path PUT /projects/:project_id/orderlines/:orderline_id/packages/update_multiple(.:format)
    包#update_multiple project_orderline_packages_path GET /projects/:project_id/orderlines/:orderline_id/packages(.:format) 包#index POST /projects/:project_id/orderlines/:orderline_id/packages(.:format) 包#创建 new_project_orderline_package_path GET /projects/:project_id/orderlines/:orderline_id/packages/new(.:format) 包#新 edit_project_orderline_package_path GET /projects/:project_id/orderlines/:orderline_id/packages/:id/edit(.:format) 包#编辑 project_orderline_package_path GET /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format) 包#show 补丁 /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format) 包#更新 PUT /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format) 包#更新 删除 /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format)

【问题讨论】:

  • 你检查过你的路线了吗? localhost:3000/routes,它对这条 PUT 路由有什么看法?抱歉,我只是没这么快发现错误……
  • 这条路线不存在,这在某种意义上是正确的,PUT 应该用于 update_multiple_project_orderline_packages_path,...对于 project_orderline_packages_path 我只有 GET 和 POST
  • 使用此路由调用此表单时似乎出现错误...update_multiple_project_orderline_packages_path, method: :put do 。 Rails 尝试这条你没有定义的路由 projects/47/orderlines/18/packages。
  • 如果我刷新包的索引页面,然后我提交表单就可以了

标签: ruby-on-rails path controller routing routes


【解决方案1】:

您的 form_tag 代码是 update_multiple_project_orderline_packages_path 我觉得应该是update_multiple_project_orderline_package_path(project_id, orderline_id, package_id)

我不是 100% 确定我上面的陈述,因为你给出了乱七八糟的 Rails 路线,难以阅读

您的表单操作似乎转到packages#edit_multiple 控制器 所以粘贴你的edit_multiple 方法,而不是create 方法

您是使用 javascript 实现上述场景,还是仅使用纯 HTML?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多