【问题标题】:RoR routing problem. Calling custom action, but getting redirected to show actionRoR 路由问题。调用自定义操作,但被重定向以显示操作
【发布时间】:2010-02-09 05:20:08
【问题描述】:

我正在开发一个使用 ruby​​ on rails 的项目,但我遇到了一个非常困难的基本问题。我试图在我的一个控制器中调用自定义操作,但请求以某种方式被重定向到默认的“显示”操作,我不知道为什么。

edit.html.erb 中的链接:

<%= link_to 'Mass Text Entry', :action=>"create_or_add_food_item_from_text" %>

来自 development.log 的错误:

ActiveRecord::RecordNotFound (Couldn't find Menu with ID=create_or_add_food_item_from_text): app/controllers/menus_controller.rb:20:in `show'

routes.rb 文件:

ActionController::Routing::Routes.draw do |map|
map.resources :nutrition_objects
map.resources :preference_objects
map.resources :institutions
map.resources :locations
map.resources :menus
map.resources :food_items
map.resources :napkins
map.resources :users
map.resource  :session, :controller => 'session'

map.root :controller=>'pages', :action=>'index'

map.about  '/about',  :controller=>'pages', :action=>'about'
map.contact '/contact', :controller=>'pages', :action=>'contact'
map.home   '/home',    :controller=>'pages', :action=>'index'

map.user_home   '/user/home',   :controller=>'rater', :action=>'index'
map.user_napkins   '/user/napkins', :controller=>'rater', :action=>'view_napkins'
map.user_preferences  '/user/preferences',:controller=>'rater', :action=>'preferences'

map.blog   '/blog', :controller=>'pages', :action=>'blog'
map.signup  '/signup',  :controller=>'users',  :action=>'new'
map.login  '/login',  :controller=>'session', :action=>'new'
map.logout  '/logout',  :controller=>'session', :action=>'destroy'

# Install the default routes as the lowest priority. 
map.connect ':controller/:action'
map.connect ':controller/:action/:id' 
map.connect ':controller/:action/:id.:format'
end

菜单控制器.rb:

class MenusController < ApplicationController
...
   def create_or_add_food_item_from_text  
   end
...
end

create_or_add_food_item_from_text.html.erb 只是有一个 div 来显示一个带有文本框的表单。我的应用程序的其余部分工作正常,但这让我很难过。

感谢任何帮助。

【问题讨论】:

    标签: ruby-on-rails routing rails-routing


    【解决方案1】:

    尝试在:menus 资源之前明确地将路由添加到您的文件中:

    map.connect "/menus/create_or_add_food_item_from_text",
      :controller => "menus", :action => "create_or_add_food_item_from_text"
    
    map.resources ...
    

    之前声明的路由有更高的优先级,这里的问题是map.resources实际上阻止了某些路径被路由。

    即使不考虑这个问题,最好还是通过资源或命名/未命名路由显式映射所有路径,并最终从您的应用中消除通用 :controller/:action:controller/:action/:id 路由。

    【讨论】:

    • 我重新排列了我的 routes.rb 文件,并像您建议的那样在 :menus 资源之前明确声明了路线。结果很好。感谢您的快速建议
    【解决方案2】:

    link_to 期望您的操作的路径作为第二个参数 - 看起来您将 link_to 传递给了错误的路径值。检查开发日志以查看 rails 认为您正在寻找的路径。

    【讨论】:

    • rails 文档有 link_to(name, options = {}, html_options = nil),所以我很确定我正确设置了链接
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2010-09-07
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多