请求未达到以 "path" 结尾的控制器操作
Controller action ending in "path" not being reached by request
对于我的生活,我无法弄清楚为什么我的控制器没有进行 SQL 调用,然后将其传递给视图。
在我的应用程序的每个其他部分,包括同一控制器中的其他方法,不用担心。但无论出于何种原因,我都无法做到这一点。
app/controllers/referrals_controller.rb
class ReferralsController < ApplicationController
def index # <- This works fine.
@referrals = Referral.all
@referral = Referral.first
@reminder = Reminder.first
respond_to(:js, :html)
end
def category_path # <- This doesn't work
@referrals = Referral.where(:category => :option)
@referral = @referrals.first
respond_to :js
end
def fetch_content # <- This works fine.
@referral = Referral.find(params[:follow_id])
respond_to :js
end
...
end
Config/routes.rb
Rails.application.routes.draw do
...
resources :referrals
get '/referrals' => 'referrals#index'
get '/category_path' => 'referrals#category_path', as: 'category'
get '/fetch_content' => 'referrals#fetch_content', as: 'fetch_content'
end
以下是调用这些路由的视图部分。
app/views/referrals/index.html.erb
<%= link_to 'Immigration Referral', category_path(:option => 'Immigration Referral'), remote: true, class: 'category-links' %> -
...
<%= link_to referral.title, fetch_content_path(:follow_id => referral.id), remote: true %>
尽管 category_path
和 fetch_content
的设置几乎相同,但 fetch_content
工作完美,而 category_path
甚至没有 SQL查询。在我使用 fetch_content
的地方,日志显示
Started GET "/fetch_content?follow_id=1" for 127.0.0.1 at 2018-02-24 09:22:16 -0600
Processing by ReferralsController#fetch_content as JS
Parameters: {"follow_id"=>"1"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
Referral Load (0.3ms) SELECT "referrals".* FROM "referrals" WHERE "referrals"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
Rendering referrals/fetch_content.js.erb
Rendered referrals/_content.html.erb (0.3ms)
Rendered referrals/fetch_content.js.erb (2.6ms)
Completed 200 OK in 19ms (Views: 14.9ms | ActiveRecord: 0.5ms)
然而,当我使用category_path
时,结果是这样的:
Started GET "/category_path?option=Immigration+Referral" for 127.0.0.1 at 2018-02-24 09:22:22 -0600
Processing by ReferralsController#category_path as JS
Parameters: {"option"=>"Immigration Referral"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
Rendering referrals/category_path.js.erb
Rendered referrals/_titles.html.erb (0.7ms)
Rendered referrals/_content.html.erb (0.4ms)
Rendered referrals/category_path.js.erb (32.6ms)
Completed 200 OK in 80ms (Views: 62.1ms | ActiveRecord: 0.2ms)
而且在我看来 @referrals.nil?
正在返回 true
,如果它没有进行 SQL 调用,我会期待它。那么我的问题是,为什么?!为什么我的控制器不进行 SQL 调用。我什至尝试更改为更简单的内容,例如 @referrals = Referral.all
,但仍然不会触发 SQL 调用。发生了什么?
似乎后缀 "path" 对控制器内的任何操作都无效,可能是因为它应该与路由冲突 Rails 管理,正如@apneadiving 所指出的。
如果您使用后缀路径设置动作,并尝试列出该控制器的动作方法,您将看到该动作不存在:
class ReferralsController < ApplicationController
...
def category_path # <- This doesn't work
...
end
def fetch_content_path # <- This works fine.
...
end
end
控制器有两个动作以*_path
结束。现在询问你得到的操作方法:
ReferralsController.action_methods
=> #<Set: {"new", "index", "update", "create", "edit", "destroy", "show"}>
如果删除操作名称中的最后一个 "h" 字符会怎样?:
ReferralsController.action_methods
=> #<Set: {"new", "index", "update", "create", "edit", "destroy", "show", "category_pat"}>
操作出现在那里,这就是为什么您的 fetch_content 操作可以达到而类别一没有的原因。解决方案只是重命名操作方法。
对于我的生活,我无法弄清楚为什么我的控制器没有进行 SQL 调用,然后将其传递给视图。
在我的应用程序的每个其他部分,包括同一控制器中的其他方法,不用担心。但无论出于何种原因,我都无法做到这一点。
app/controllers/referrals_controller.rb
class ReferralsController < ApplicationController
def index # <- This works fine.
@referrals = Referral.all
@referral = Referral.first
@reminder = Reminder.first
respond_to(:js, :html)
end
def category_path # <- This doesn't work
@referrals = Referral.where(:category => :option)
@referral = @referrals.first
respond_to :js
end
def fetch_content # <- This works fine.
@referral = Referral.find(params[:follow_id])
respond_to :js
end
...
end
Config/routes.rb
Rails.application.routes.draw do
...
resources :referrals
get '/referrals' => 'referrals#index'
get '/category_path' => 'referrals#category_path', as: 'category'
get '/fetch_content' => 'referrals#fetch_content', as: 'fetch_content'
end
以下是调用这些路由的视图部分。
app/views/referrals/index.html.erb
<%= link_to 'Immigration Referral', category_path(:option => 'Immigration Referral'), remote: true, class: 'category-links' %> -
...
<%= link_to referral.title, fetch_content_path(:follow_id => referral.id), remote: true %>
尽管 category_path
和 fetch_content
的设置几乎相同,但 fetch_content
工作完美,而 category_path
甚至没有 SQL查询。在我使用 fetch_content
的地方,日志显示
Started GET "/fetch_content?follow_id=1" for 127.0.0.1 at 2018-02-24 09:22:16 -0600
Processing by ReferralsController#fetch_content as JS
Parameters: {"follow_id"=>"1"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
Referral Load (0.3ms) SELECT "referrals".* FROM "referrals" WHERE "referrals"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
Rendering referrals/fetch_content.js.erb
Rendered referrals/_content.html.erb (0.3ms)
Rendered referrals/fetch_content.js.erb (2.6ms)
Completed 200 OK in 19ms (Views: 14.9ms | ActiveRecord: 0.5ms)
然而,当我使用category_path
时,结果是这样的:
Started GET "/category_path?option=Immigration+Referral" for 127.0.0.1 at 2018-02-24 09:22:22 -0600
Processing by ReferralsController#category_path as JS
Parameters: {"option"=>"Immigration Referral"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
Rendering referrals/category_path.js.erb
Rendered referrals/_titles.html.erb (0.7ms)
Rendered referrals/_content.html.erb (0.4ms)
Rendered referrals/category_path.js.erb (32.6ms)
Completed 200 OK in 80ms (Views: 62.1ms | ActiveRecord: 0.2ms)
而且在我看来 @referrals.nil?
正在返回 true
,如果它没有进行 SQL 调用,我会期待它。那么我的问题是,为什么?!为什么我的控制器不进行 SQL 调用。我什至尝试更改为更简单的内容,例如 @referrals = Referral.all
,但仍然不会触发 SQL 调用。发生了什么?
似乎后缀 "path" 对控制器内的任何操作都无效,可能是因为它应该与路由冲突 Rails 管理,正如@apneadiving 所指出的。
如果您使用后缀路径设置动作,并尝试列出该控制器的动作方法,您将看到该动作不存在:
class ReferralsController < ApplicationController
...
def category_path # <- This doesn't work
...
end
def fetch_content_path # <- This works fine.
...
end
end
控制器有两个动作以*_path
结束。现在询问你得到的操作方法:
ReferralsController.action_methods
=> #<Set: {"new", "index", "update", "create", "edit", "destroy", "show"}>
如果删除操作名称中的最后一个 "h" 字符会怎样?:
ReferralsController.action_methods
=> #<Set: {"new", "index", "update", "create", "edit", "destroy", "show", "category_pat"}>
操作出现在那里,这就是为什么您的 fetch_content 操作可以达到而类别一没有的原因。解决方案只是重命名操作方法。