【问题标题】:Routing Error - custom controller路由错误 - 自定义控制器
【发布时间】:2012-04-03 09:30:32
【问题描述】:

我有很多通过关联。

公司通过关注有很多用户。 我希望用户能够关注公司。 - 我正在为用户使用设计。

我在我的公司控制器中有以下操作。

def follow
  @firm.users << current_user
end

在我的 routes.rb 中

resources :firms do
 post :follow, on: :member
end

在我的公司看来

<%= link_to "Follow", follow_firm_path(@firm), method: :post %>

但是,当我在浏览器中不断收到以下路由错误时

No route matches {:action=>"follow", :controller=>"firms"}

Rake Routes 确认以下内容

follow_firm POST   /firms/:id/follow(.:format)   firms#follow

任何想法可能是什么问题?

非常感谢


编辑:控制器代码

class FirmsController < ApplicationController 


before_filter :authenticate_user!, :except => [:show, :index] 

def index 
  @firm_names = Firm.all.map &:name 
  direction = params[:direction] 
  direction ||= "ASC" 
  @firms = Firm.order("name #{direction}")   
  respond_to do |format| 
   format.html # index.html.erb 
   format.js 
  end 
end 

def follow 
 @firm.users << current_user 
end 

我在索引视图的部分中使用跟随操作。

【问题讨论】:

  • 你为什么使用'on::member'和'method::post'。正确的方式是 ':on => :member' 和 ':method => :post'

标签: ruby-on-rails ruby-on-rails-3 controller routes has-many-through


【解决方案1】:

一切看起来都不错,这应该可以完美运行。除了我在以下行中看到一个错字

<%= link_to "Follow", follow_firm_path(@firm), method: :post %>

在 :method 之后应该有一个 => 而不是 : 。这将使链接成为获取请求而不是发布请求,这可能是问题所在,尝试使用简单的链接并替换 post 将进入您的 routes.rb 只是为了测试问题是否因此而产生。

你也可以从控制台测试路由方法

rails c
app.follow_firm_path(2)

我注意到你的路线也有错误,应该有一个 => 而不是 : 在 :on 之后

resources :firms do
 post :follow, :on => member
end

【讨论】:

  • 啊,我认为a : after 是符号后的哈希火箭的同义词。已将所有语法更改为 : 和 => 并且...终端似乎同意我们的路线确实存在:“/firms/2/follow” 但是浏览器仍在声明:没有路线匹配 {:action=> "跟随", :controller=>"公司"}
  • 您是否尝试在您的 routes.rb 和链接中同时使用 get 。 resources :firms do get :follow, :on =&gt; member end&lt;%= link_to "Follow", follow_firm_path(@firm) %&gt;
  • 是的,我在两者上都使用 GET 进行了尝试。这可能是我的控制器操作有问题吗?
  • @RMcNairn:请编辑问题以添加更多信息,而不是答案。在这种情况下,我已经为您完成了。
  • @RMcNaim:还请编辑问题以在您的 routes.rb 和您的视图中添加更新的行。
【解决方案2】:

你应该定义这样的方法...

  resources :firms do
    collection
      post :follow, on: :member
    end
  end

我认为如果这个方法没有创建任何东西,它的类型应该是 get。

试试看

【讨论】:

  • 嗨 kasif.ali,我试了一下,这是一个错误:不能在资源范围外使用成员。当我通过它时,您的建议略有修改:resources :firms do collection do post :follow, on: :member end end。我得到相同的结果 No route matches {:action=>"follow", :controller=>"firms"} 如果我将其更改为 GET,则会在 Scope 上收到上述错误。
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 2011-11-24
  • 2013-08-23
  • 2015-10-12
  • 2011-12-03
  • 2013-09-30
  • 2018-09-14
  • 2018-02-20
相关资源
最近更新 更多