【问题标题】:Rails 3 nested resource route problem as form_forRails 3嵌套资源路由问题为form_for
【发布时间】:2011-02-05 22:04:04
【问题描述】:

我的 routes.rb 中有这样的嵌套资源 - (my rake:routes gist)

namespace(:admin) do 
  resources :restaurants do
    resources :menus
    resources :menu_items
  end
end

在控制器中:

def new 
  @restaurant = Restaurant.find(params[:restaurant_id])
  @menu_item =  @restaurant.menu_items.build
end

尝试通过 url:http://127.0.0.1:3001/admin/restaurants/1/menu_items/new 创建一个新的 MenuItem(操作 #new)我收到错误:

NoMethodError in Admin/menu_items#new

Showing /home/fps/workspace3/peded/app/views/admin/menu_items/_form.html.erb where line #1 raised:

undefined method `admin_menu_items_path' for #<#<Class:0xb6582d78>:0xb6581f2c>
Extracted source (around line #1):

1: <%= form_for @menu_item do |f| %>
...

如何使此表单起作用?它是由一个漂亮的:脚手架创建的

更新

我也在_form中试过这个:

<%= form_for [:restaurant, @menu_item] do |f| %>

但以类似的错误结束:

Showing /home/fps/workspace3/peded/app/views/admin/menu_items/_form.html.erb where line #1 raised:

undefined method `restaurant_admin_menu_items_path' for #<#<Class:0xb68162b0>:0xb6813dd0>
Extracted source (around line #1):

1: <%= form_for [:restaurant, @menu_item] do |f| %

我应该提交错误吗?

【问题讨论】:

  • 这个问题你解决了吗?命名空间 admin 中的嵌套资源应创建路由 admin_restaurant_admin_menu_items_path,但创建路由 admin_restaurant_menu_items_path。如果你脚手架 admin/menu,控制器中已经设置了 :admin 命名空间这一定是 rails 中的错误?
  • @bandola 我问过 /ryanb,他指出这很可能是一个错误
  • @FabianoPS:有什么消息吗?仍然收到与您相同的错误消息!
  • 仍然没有在网上找到干净的解决方案...

标签: ruby-on-rails-3 routes form-for


【解决方案1】:

form_for([@restaurant, @menu_item])

【讨论】:

  • 由于命名范围,它产生:undefined method admin_restaurant_admin_menu_items_path' for #:0xb6609ecc>` 所以我只能认为这是一个错误
【解决方案2】:

我认为问题出在形式上。这对我有用:

<%= form_for(@menu_items, :url => restaurant_menu_items_path(@menu_items.restaurant)) do |f| %>

【讨论】:

  • 使用这种方法,我得到错误:没有路由匹配 {:action=>"show", :controller=>"menu_items"}
【解决方案3】:

我也有同样的问题。我找到的唯一解决方案是将 url 传递给form_for

<% url = (action_name == "new" ? {:action=>"create", :controller=>"admin/menu_item"} : {:action=>"update", :controller=>"admin/menu_item"})%>

<%= form_for [@restaurant ,@menu_item], :url=>url do |f| %>

另外注意,您不会看到params[:menu_item] back,而是看到params[:admin_menu_item]

希望能帮到你!

【讨论】:

  • 唯一对我有帮助的东西,即使它看起来很丑
  • 太棒了!它拯救了我的一天
【解决方案4】:

您可以通过在命令行上运行来查找您的路线。

rake routes

您似乎错误地调用了您的路线。

数组表示法是:

form_for([:admin, @restaurant, @menu_item])

以及创建的命名路由:

admin_restaurant_menu_items_path(@restaurant)

【讨论】:

  • 第一个,yield: undefined method admin_admin_restaurant_admin_menu_items_path' for #:0xb665a570>`
  • 第二个,yield: undefined method admin_menu_items_path' for #:0xb6863790>`
【解决方案5】:

处理嵌套资源和命名空间是一个越南 (pita)。

这是我的讨厌解决方案:

= form_for @admin_menu_item, 
    :url => (@admin_menu_item.try(:new_record?) ? 
        admin_restaurant_menu_items_path(@admin_restaurant) : 
        admin_menu_item_path(@ admin_menu_item)) do |f|
    ...

希望你能帮上忙。

【讨论】:

    【解决方案6】:

    唯一对我有效的解决方案(对于新资源和编辑资源)是:

    form_for @menu_item, :url => url_for([:admin, @restaurant, @menu_item])
    

    【讨论】:

      【解决方案7】:

      我正在使用 Rails 5(我认为这并不重要),这对我有用:

      = simple_form_for [:admin, @restaurant, @menu_item] do |f|
      

      它是simple_form_for 而不是form_for 这一事实可能也无关紧要。

      有趣的是,我正在使用完全相同的资源名称构建一个应用程序。

      【讨论】:

        猜你喜欢
        • 2011-09-07
        • 2016-11-03
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        • 1970-01-01
        相关资源
        最近更新 更多