【问题标题】:Rails 4 action => destroy calls updateRails 4 动作 => 销毁调用更新
【发布时间】:2014-03-07 21:19:20
【问题描述】:

在 Rails 4 中调用 destroy 会在 #update 中引发错误。更新代码在调用时可以正常工作,就像 new / create 一样。

路线:

  namespace :admin do
    resources :pages
  end

match ':controller(/:action(/:id))', :via => [:get, :post]

控制器:

class Admin::PagesController < ApplicationController

  layout 'admin'
  ...

  # PUT /pages/1
  # PUT /pages/1.xml
  def update
    logger.info("Starting update")
    @page = Page.find(params[:id])

    if @page.update_attributes(page_params)
      flash[:notice] = "Page updated successfully."
      redirect_to(:action => 'show')
    else
      @page_count = Page.count
      render('edit')
    end
  end

  def delete
    logger.info("Starting delete")
    @page = Page.find(params[:id])
    logger.info("Ending delete")
  end

  def destroy
    logger.info("Starting destroy")
    #page = Page.find(params[:id]).destroy
    @page.destroy
    logger.info("After destroy")
    flash[:notice] = "Page destroyed successfully."
    redirect_to(:action => 'index')
  end

    # Never trust parameters from the scary internet, only allow the white list through.
    def page_params
      params.require(:page).permit(:sport, :name, :html_code, :permalink)
    end

调用delete html.erb

<% @page_title = "Delete Page" %>

<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>

<div class="pages delete">
  <h2>Delete Page</h2>

  <%= form_for([:admin, @page], :url => {:action => 'destroy', :id => @page.id}) do |f| %>

    <p>Are you sure you want to permanently delete this page?</p>

    <p class="reference-name"><%= @page.permalink %></p>

    <div class="form-buttons">
      <%= submit_tag("Delete Page") %>
    </div>

  <% end %>
</div>

控制台:

Started GET "/admin/pages/delete/4" for 127.0.0.1 at 2014-03-07 12:56:38 -0800
Processing by Admin::PagesController#delete as HTML
  Parameters: {"id"=>"4"}
Starting delete
  Page Load (0.3ms)  SELECT `pages`.* FROM `pages` WHERE `pages`.`id` = 4 LIMIT 1
Ending delete
  Rendered admin/pages/delete.html.erb within layouts/admin (1.1ms)
Completed 200 OK in 10ms (Views: 8.2ms | ActiveRecord: 0.3ms)


Started PATCH "/admin/pages/4" for 127.0.0.1 at 2014-03-07 12:56:46 -0800
Processing by Admin::PagesController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"3al7JBY9e1nl+xq7uH2m2S+sWDmhvFLhxuYeUp5ZKv8=", "commit"=>"Delete Page", "id"=>"4"}
Starting update
  Page Load (0.3ms)  SELECT `pages`.* FROM `pages` WHERE `pages`.`id` = 4 LIMIT 1
Completed 400 Bad Request in 2ms

ActionController::ParameterMissing (param not found: page):
  app/controllers/admin/pages_controller.rb:85:in `page_params'
  app/controllers/admin/pages_controller.rb:59:in `update'


  Rendered /usr/local/var/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.7ms)
  Rendered /usr/local/var/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.3ms)
  Rendered /usr/local/var/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered /usr/local/var/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (15.8ms)

【问题讨论】:

    标签: ruby-on-rails-4 routing


    【解决方案1】:

    首先,从您的config/routes.rb 中删除这条路线:

    match ':controller(/:action(/:id))', :via => [:get, :post]
    

    这是一条包罗万象的路线,可能会导致您的应用出现不当行为。根据Routing Guide,您应该使用resources 和朋友。

    其次,您的所有表单实际上只是一个删除按钮。您可以更轻松地做到这一点:

    <p>Are you sure you want to permanently delete this page?</p>
    
    <p class="reference-name"><%= @page.permalink %></p>
    
    <%= button_to "Delete Page", [:admin, :page], :method => :delete %>
    

    button_to 方法创建一个表单,因此您不必这样做。这里需要注意的是,这个button_to 正在使用:method =&gt; :delete,这将导致使用DELETE /admin/pages/4 路由;转到控制器中的destroy 操作。

    您的表单之前没有这样做,它向同一路由提交了PUT 请求,该请求转到update 操作,这就是您所看到的情况。

    【讨论】:

    • 很好的答案,顺便说一句,您的 Rails 4 Action 书是真正的宝石。
    • 谢谢 :) Steve Klabnik 现在正在写这方面的所有内容。
    • 谢谢。如果我删除包罗万象的匹配路线,我从索引页面到删除页面的链接失败: 'delete', :id => page.id} ) %> with "No route matches {:action=>"delete", :id=>1, :controller=>"admin/pages"}"
    • @TomWillson:根据路由指南定义正确的路由。
    猜你喜欢
    • 2014-08-07
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多