Robert Cordes
Robert Cordes

Reputation: 381

Problems using namespaced models and controllers in Rails

I'm developing a Ruby on Rails app and I'm trying to organize my code a bit better. Part of the app is a knowledgebase which is organized into categories and articles - pretty standard stuff.

Here is the way I have everything set up (at least what I think is important):

routes.rb

namespace :knowledgebase do
  resources :categories
  resources :articles
end

models/knowledgebase/article.rb

class Knowledgebase::Article < ActiveRecord::Base
  self.table_name = 'knowledgebase_articles'
  belongs_to :category, class_name: 'Knowledgebase::Category', foreign_key: 'knowledgebase_category_id'
end

models/knowledgebase/category.rb

class Knowledgebase::Category < ActiveRecord::Base
  self.table_name = 'knowledgebase_categories'
  has_many :articles, class_name: 'Knowledgebase::Article'
end

controllers/knowledgebase/articles_controller.rb

class Knowledgebase::CategoriesController < ApplicationController
  load_and_authorize_resource
  before_action :authenticate_user!
  before_action :set_category, only: [:show, :edit, :update, :destroy]

  def new
    @category = ::Knowledgebase::Category.new
  end

  def create
    @category = ::Knowledgebase::Category.new(category_params)

    if @category.save
      redirect_to knowledgebase_categories_url, notice: '...'
    else
      render :new
    end
  end

  # ...

  private
    def set_category
      @category = ::Knowledgebase::Category.find(params[:id])
    end

    def category_params
      params.require(:category).permit(:title)
    end
end

views/knowledgebase/categories/_form.html.erb

<%= form_for @category do |form| %>
  <%= form.text_field :title
  <%= form.submit %>
<% end %>

My Problem: when I try to submit the form (either new or edit) I get the error:

param is missing or the value is empty: category

When I setup the form like this: <%= form_for ([:knowledgebase, @category]) do |form| %> I get the following error:

undefined method `knowledgebase_knowledgebase_categories_path' for #<#<Class:0x007fecd7a78908>:0x007fecd707ad20>

The same goes for articles. I'm using Rails 4.2.3.

If anybody could help me or guide me into the right direction I would be really thankful - I have googled for three days now I tried everything I could think of.

Update 1

This is the params log generated:

{"utf8"=>"✓",
"authenticity_token"=>"fjOs...VA==",
"commit"=>"Category erstellen",
"knowledgebase_category"=>{"title"=>"Test Title"}}

Upvotes: 3

Views: 83

Answers (1)

Pavan
Pavan

Reputation: 33542

As you look into the params hash, it has knowledgebase_category not category. So try changing category_params to the below

def category_params
  params.require(:knowledgebase_category).permit(:title)
end

An Advice:

Always look into the generated params in the log. It really helps a lot in finding the solution to most of the errors.

Upvotes: 4

Related Questions