【问题标题】:how to handle form_for in rails namspaced controller如何在rails namspaced控制器中处理form_for
【发布时间】:2012-09-11 08:09:14
【问题描述】:

我使用 rails 脚手架自动生成表单和视图。 但现在我不得不在根 namspace 中使用带有模型的命名空间控制器。

所以,我在没有脚手架的情况下手动生成了控制器,我在使用表单时遇到了问题。

我想下面的代码应该为命名空间控制器生成一个表单

<%= form_for @menu do |f| %>

  <div class="field">
    <%= f.label :label %><br />
    <%= f.text_field :label %>
  </div>
  <div class="field">
    <%= f.label :order %><br />
    <%= f.text_field :order %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

但事实并非如此。它说

undefined method `model_name' for NilClass:Class

用脚手架生成器做rails似乎很容易,但是如果想手动做,rails helper方法对它们不利。

我已经搜索了form_for文档并将代码更改为

<%= form_for @menu, :url => admin_menu_path do |f| %>

然后它显示一个不同的错误

No route matches {:action=>"show", :controller=>"admin/menus"}

我的 rake 路由给出以下输出

     admin_root        /admin(.:format)                admin/menus#index
    admin_menus GET    /admin/menus(.:format)          admin/menus#index
                POST   /admin/menus(.:format)          admin/menus#create
 new_admin_menu GET    /admin/menus/new(.:format)      admin/menus#new
edit_admin_menu GET    /admin/menus/:id/edit(.:format) admin/menus#edit
     admin_menu GET    /admin/menus/:id(.:format)      admin/menus#show
                PUT    /admin/menus/:id(.:format)      admin/menus#update
                DELETE /admin/menus/:id(.:format)      admin/menus#destroy

如果我错了,请纠正我,但我认为 ruby​​ 在 Admin 命名空间中找不到模型菜单,这很明显。所以,我尝试了 ::Menu.new ,我认为它会在上层命名空间中查找,但没有结果!

【问题讨论】:

    标签: ruby-on-rails namespaces form-for


    【解决方案1】:

    您可能忘记在控制器中实例化 @menu

    消息“NilClass:Class 的未定义方法 'model_name'”表明 @menunil

    由于admin_menu_path 需要一个Menu 实例,Rails 在传递nil 时无法正确生成路由。

    在控制器中正确设置实例变量后,您可以使用:

    form_for [:admin, @menu] do |f| ... end
    

    【讨论】:

    • 是的,它起作用了,但我还不明白 form_for 是如何工作的,我没有在 index 方法中添加 Menu.new ,因为它会创建一个新模型。如果我想在索引中放置一个表单,我该怎么做?
    • 它只创建Menu 的新实例,而不是数据库中的记录。这是为数据库资源制作表单的最简单和最推荐的方法。在这里你可以得到一些关于form_for如何工作的信息:api.rubyonrails.org/classes/ActionView/Helpers/…
    【解决方案2】:

    form_for [:admin, @menu] do |f| ... end 之类的东西应该可以工作。类似问题:Nested resources in namespace form_for

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      相关资源
      最近更新 更多