2012-04-24 86 views
2

我在我的会员控制器中创建了一个自定义操作req,并为其定义了路由。但是,当我在link_to上给出该自定义操作的路径时,它给了我错误,指出未知操作,操作'show'可能没有找到MembershipsController.I dny明白为什么它找到显示操作时,我给我的自定义操作的路径。未知的操作错误

以下是隶属控制器

def req 
    @user =User.find_by_email(params[:email]) 
    @group =params[:group_id] 
    unless @group.nil? 
    if Membership.request(@user.id, @group) 
     redirect_to :back, :notice => 'Joined successfully.' 
    else 
     redirect_to :back, :notice => 'couldnot Joine.' 
    end 
    end 
end 

有我的会员资格控制器内部没有show动作在我的自定义操作。

以下是我的自定义操作路线:继

resources :memberships do 
    collection do 
    post 'req' 
    end 
end 

是我groups/show.html.haml这里我给自定义动作的路径里面的代码..

- if @collegemates.empty? 
    %p.info You have no common collegemates ... 
    - else 
    %table.datatable 
     %thead 
     %tr 
      ... 
     %tbody 
     - @collegemates.each do |c| 
      - unless Membership.group_member(c.id, @group) 
      %tr 
       %td= c.full_name 
       %td= c.email 
       %td= link_to "request to join",{:controller => :memberships, :action => "req",:email =>c.email,:group_id => @group.id},:method => "post" 

当我点击请求加入我得到这个未知的动作错误的显示操作。我在这里做错了什么?

+1

您是否包含Rails的javascripts? Rails使用javascript,以便您的链接执行发布请求。如果您没有包含JavaScript,则执行获取请求而不是发布请求。 – Mischa 2012-04-24 07:00:27

+0

如何包含此javascript ...创建也是一个发布请求不是吗?我的创建操作正常工作正常,这意味着我的发布请求正在工作fyn .. – NJF 2012-04-24 07:15:48

+0

创建可能会工作,因为它是一个带按钮的正常形式。这是一个链接,所以你需要javascript来使它做一个帖子。您必须将javascript包含在布局文件的'head'标签中,如下所示:'<%= javascript_include_tag'应用程序'%>'。其中已包含 – Mischa 2012-04-24 07:21:09

回答

2

为了做一个链接做一个POST请求,您需要的JavaScript。 Rails为你处理这件事,但你必须包含必要的文件。将<%= javascript_include_tag :defaults %>添加到布局文件将解决您的问题。如果您不这样做,将执行GET请求而不是POST请求。

1

您可能希望将您的操作分配给收款人或会员。

resources :memberships do 
    post 'req', :on => :collection # or :member 
end 

请参阅http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

:on => :collection创建像memberships/req的路线,其中
:on => :member给你喜欢memberships/:id/req对象的路由。

+0

但是他已经有了'collection do',这和':on =>:collection'一样。对于他已有的东西,这只是不同的语法。 – Mischa 2012-04-24 06:58:11

+0

啊,没有看到,因为错误的代码格式,你是对的 – pduersteler 2012-04-24 07:07:29

0

由于默认导轨提供了CRUD操作。

new,create,edit,update,delete 

代码

collection do 
    post 'req' 
end 

将产生如下的路线。

/memberships/req 

所以轨道您所请求误解/成员/:ID 并试图action.as在没有演出的动作它会引发未知的动作,以配合表演。

因此,解决办法是,你需要告知你不使用CRUD操作

这是可以做到如下

resources :memberships, :only => [] do 
collection do 
    post 'req' 
end 
end 
+0

你是对的问题,但你的解决方案是错误的。 Rails认为他需要演示操作,因为他正在执行GET请求。如果这是一个POST请求,一切都会好起来的。 – Mischa 2012-04-24 07:42:52

+0

sounder我试过你的解决方案,但我得到新的错误,说没有路由匹配“/会员资格/请求”.. – NJF 2012-04-24 07:53:13

+0

Mischa这是一个请求...当我做耙路线它显示req_memberships POST /会员资格/请求格式){:controller =>“memberships”,:action =>“req”}这意味着它是一个post请求.. – NJF 2012-04-24 07:54:32