【问题标题】:Rails 4 uninitialized constant Admin::CategoryRails 4 未初始化的常量 Admin::Category
【发布时间】:2014-08-09 03:54:03
【问题描述】:

我已经为我的所有默认模型生成了管理命名空间控制器,如下所示:

rails g scaffold_controller admin/categories name:string slug:string description:string icon_xlarge:string icon_large:string icon_medium:string icon_small:string status:integer

这会生成以下文件:

Harshas-MacBook-Pro:nomad harshamv$ rails g scaffold_controller admin/categories name:string slug:string description:string icon_xlarge:string icon_large:string icon_medium:string icon_small:string status:integer
Plural version of the model detected, using singularized version. Override with --force-plural.
      create  app/controllers/admin/categories_controller.rb
      invoke  erb
      create    app/views/admin/categories
      create    app/views/admin/categories/index.html.erb
      create    app/views/admin/categories/edit.html.erb
      create    app/views/admin/categories/show.html.erb
      create    app/views/admin/categories/new.html.erb
      create    app/views/admin/categories/_form.html.erb
      invoke  test_unit
      create    test/controllers/admin/categories_controller_test.rb

app/model/category.rb

class Category < ActiveRecord::Base

  extend FriendlyId

  friendly_id :name, use: :slugged

  has_and_belongs_to_many :venues

end

app/controller/admin/categories_controller.rb

class Admin::CategoriesController < ApplicationController
  before_action :set_admin_category, only: [:show, :edit, :update, :destroy]

  # GET /admin/categories
  def index
    @admin_categories = Admin::Category.all
  end

  # GET /admin/categories/1
  def show
  end

  # GET /admin/categories/new
  def new
    @admin_category = Admin::Category.new
  end

  # GET /admin/categories/1/edit
  def edit
  end

  # POST /admin/categories
  def create
    @admin_category = Admin::Category.new(admin_category_params)

    if @admin_category.save
      redirect_to @admin_category, notice: 'Category was successfully created.'
    else
      render :new
    end
  end

  # PATCH/PUT /admin/categories/1
  def update
    if @admin_category.update(admin_category_params)
      redirect_to @admin_category, notice: 'Category was successfully updated.'
    else
      render :edit
    end
  end

  # DELETE /admin/categories/1
  def destroy
    @admin_category.destroy
    redirect_to admin_categories_url, notice: 'Category was successfully destroyed.'
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_admin_category
      @admin_category = Admin::Category.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def admin_category_params
      params.require(:admin_category).permit(:name, :slug, :description, :icon_xlarge, :icon_large, :icon_medium, :icon_small, :status)
    end
end

app/view/admin/categories/index.html.erb

<h1>Listing admin_categories</h1>

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Slug</th>
      <th>Description</th>
      <th>Icon xlarge</th>
      <th>Icon large</th>
      <th>Icon medium</th>
      <th>Icon small</th>
      <th>Status</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @admin_categories.each do |admin_category| %>
      <tr>
        <td><%= admin_category.name %></td>
        <td><%= admin_category.slug %></td>
        <td><%= admin_category.description %></td>
        <td><%= admin_category.icon_xlarge %></td>
        <td><%= admin_category.icon_large %></td>
        <td><%= admin_category.icon_medium %></td>
        <td><%= admin_category.icon_small %></td>
        <td><%= admin_category.status %></td>
        <td><%= link_to 'Show', admin_category %></td>
        <td><%= link_to 'Edit', edit_admin_category_path(admin_category) %></td>
        <td><%= link_to 'Destroy', admin_category, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Category', new_admin_category_path %>

我的尝试

我将控制器编辑如下

 # GET /admin/categories
  def index
    @admin_categories = Category.all
  end

  # GET /admin/categories/1
  def show
  end

  # GET /admin/categories/new
  def new
    @admin_category = Category.new
  end

  # GET /admin/categories/1/edit
  def edit
  end

  # POST /admin/categories
  def create
    @admin_category = Category.new(admin_category_params)

    if @admin_category.save
      redirect_to @admin_category, notice: 'Category was successfully created.'
    else
      render :new
    end
  end

当我转到localhost/admin/categories 并单击“新类别”时,我现在收到以下错误:

我的路线文件:

Rails.application.routes.draw do

  # Admin Routing
  namespace :admin do
    resources :categories, :cities, :countries, :lists, :oauths, :regions, :tags, :users, :user_groups, :venues, :venue_photos, :venue_reviews
  end

end

【问题讨论】:

  • 你有一个命名空间admin,所以&lt;%= form_for(@admin_category) do |f| %&gt;这一行应该是&lt;%= form_for([:admin, @admin_category]) do |f| %&gt;。
  • 另一个问题 - 你的模型真的在 Admin 命名空间下吗? - 可能是Category.new 而不是Admin::Category.new
  • @Pavan 我编辑了表单,现在又遇到了另一个错误。 i.imgur.com/w9OiJGw.jpg
  • @HarshaMV 你的第二个错误。应该只是params.require(:category).pemit(....)
  • 请发布您的rake routes 输出。

标签: ruby-on-rails ruby-on-rails-4 rails-generate


【解决方案1】:

您在 routes.rb 的 namespace :admin 下定义了 resources :categories,所以您的 @ 中的这一行987654326@

<%= form_for(@admin_category) do |f| %>

应该是

<%= form_for([:admin, @admin_category]) do |f| %>

欲了解更多信息,请参阅此API

更新

第二个错误是因为这一行

params.require(:admin_category).permit(:name, :slug, :description, :icon_xlarge, :icon_large, :icon_medium, :icon_small, :status)

应该是

params.require(:category).permit(:name, :slug, :description, :icon_xlarge, :icon_large, :icon_medium, :icon_small, :status)

【讨论】:

  • 我是第一次使用 namescope,即使在阅读完文档后也很困惑。我更改了 params.require(:category).pemit(....) 并最终出现此错误:( i.imgur.com/Faa3dIS.jpg
  • @Harsha MV 当您在create action 中将这一行redirect_to @admin_category 更改为redirect_to admin_categories_url 时会发生什么?
  • 你也可以试试redirect_to admin_category_path(@admin_category)脚手架生成器期望Category模型被命名空间,这就是你需要调整一些东西的原因。
  • 该死的看起来我可以手动编写我的控制器更容易:(两者似乎都不起作用。同样的错误
  • @HarshaMV 祝你好运。晚安:)
【解决方案2】:

要访问命名空间之外的模型,您需要调用 ::Category.new 而不是 Admin::Category.new

【讨论】:

  • 带有前缀 :: ?
  • 正确。如果 Category 在 admin 命名空间下,您甚至不必指定命名空间。你可以打电话给Category.new。
【解决方案3】:

正如您的错误所示,这是您调用表单的方式的问题。您的表单需要引用 admin 命名空间,如下所示:

<%= form_for [:admin, @category] do |f| %>

但是,脚手架构建文档的方式与我推荐的方式有很多不同。

我还建议简化脚手架控制器中的代码以引用简单的@category 和@categories,而不是@admin_category 和@admin_categories。

此外,模型不应位于 admin 命名空间中,因此 Admin::Category.new 应为 Category.new。其余的模型调用也应相应调整。

【讨论】:

  • 尝试进入您的控制器文件并将 require(:admin_category) 更改为 require(:category)。
  • 这些错误是因为我在名称范围之外使用模型吗?我试图简单地说。 i.imgur.com/Faa3dIS.jpg
  • 您只需进行更多编辑即可清除此问题。要解决最近的问题,请尝试 redirect_to admin_category_path(@category),如果您使用我的变量名建议。
  • 如果您仍然遇到奇怪的错误而失去耐心,不妨稍作休息并完成本教程:everydayrails.com/2012/07/31/…
  • freak :D 我想我需要好好休息一下。非常感谢您提供的链接,我会检查一下:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多