新手问题 在做一个练习,删除一条数据的时候总是找不到路由

bendise · 2014年04月22日 · 最后由 bendise 回复于 2014年04月23日 · 2729 次阅读
class EventsController < ApplicationController
    def index
        @events = Event.all
    end

    def new
        @event = Event.new
    end

    def create
        #params.permit!
        @event = Event.new(event_params)
        @event.save

        redirect_to :action => :index
    end

    def show
        @event = Event.find(params[:id])
    end

    def edit
        @event = Event.find(params[:id])
    end

    def update
        #params.permit!
        @event = Event.find(params[:id])
        @event.update_attributes(event_params)

        redirect_to :action => :show, :id => @event
    end

    def destroy
        @event = Event.find(params[:id])
        @event.destroy

        redirect_to :action => :index
    end

    private

    def event_params
        params.require(:event).permit(:id, :name, :description)
    end
end

index.html.erb

<ul>
<% @events.each do |event| %>
  <li>
  <%= event.name %>
  <%= link_to 'Show', :controller => 'events', :action => 'show', :id => event %>
  <%= link_to 'Edit', :controller => 'events', :action => 'edit', :id => event %>
  <%= link_to 'Delete', :controller => 'events', :action => 'destroy', :id => event %>
  </li>
<% end %>
</ul>
<%= link_to 'New event', :controller => 'events', :action => 'new' %>

前面的 Show 和 Edit 正常 但是点击 Delete 的时候总是跳到 Show 的 Action 中 我的 route.rb Rails.application.routes.draw do resources :events

这个是什么原因?怎么能正常进入 destroy 的 action 中呢?

HTTP 动作不对,加 method 参数:

<%= link_to 'Delete', :controller => 'events', :action => 'destroy', :id => event, :method => 'delete' %>
<%= link_to 'Delete', { :controller => 'events', :action => 'destroy', :id => event }, :method => 'delete' %>

很久没写过这种格式的 url 参数了,用这个短格式

<%= link_to 'Delete', event, :method => 'delete' %>

link_to 之后的第三个 block 是传向 html 的参数

这种不是应该这么写吗? <%= link_to "Delete", "/events/destroy/#{id}", onclick=>"return confirm('Are you sure?')" %>

为什么不写 path 路径? <%= link_to 'Delete',event_path , :id => event, :method => 'delete' %>

#6 楼 @315046509 event_path 还需要参数 event_path(event)

#6 楼 @315046509 奥,跟我 1 楼一样的错误,应该是

<%= link_to 'Delete',event_path(:id => event), :method => 'delete' %>

#5 楼 @ucooling method 这个功能在 Rails 里算是一个独特的功能,一般来说点击触发的是 get 动作,但是 rails 的 method 可以让指向 RESTful 路由五种动作中的任何一种。

:method => :post

这个相当于在其他框架中提交一个 post 表单。 在你的例子中删除是 RESTful 中的 delete 动作,所以要加上

:method => :delete

最后,这个神奇的功能是由 ujs 实现的,这需要在 application.js 中加上这个 js 文件。 在我的项目里用的是 jquery,所以是

//= require jquery
//= require jquery_ujs

#8 楼 @Rei 对对对!没加参数 <%= link_to 'Delete',event_path(event), :method => 'delete' %> 应该是对的!! 对了,我现在遇到一个很奇特的问题,能帮忙看下么? http://ruby-china.org/topics/18787 谢谢了!!这个问题很困扰阿!

我用 Rei 和 315046509 两位的方法都可以删除了,但那种写法更好呢?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号