Leon92
Leon92

Reputation: 555

How to add a category to a post in rails without a category controller

thank you all for your help in advanced.

I'm an absolute beginner in rails and I'm trying to work through a tutorial.

The task is as follows. I have a post model built from a scaffold with only the content:string field.

Then a category model, not a scaffold etc. The idea is a category has_many :posts and the post belongs_to :category. A category has the fields name and description. This is fine and I understand this, I've added these to the model.

I've also run the migration

   rails generate migration AddCategoryToPost category:references

How do I now enable the user to add a category when they make their post.

So the order of events is a user creates a post, where they can add a category, as the post is created. The category has name, and description that the user will need to define.

  def new
   @post = Post.new
  end
  def create
   @category = Category.new(caregory_params)
   @post = Post.new(post_params)
   respond_to do |format|
    if @post.save
      format.html { redirect_to @post, notice: 'Post was successfully  created.' }
      format.json { render :show, status: :created, location: @post }
    else
      format.html { render :new }
     format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
 end

How to I alter the new,create, and update methods of the post controller to achieve this, and thus what should the form contain to create a new post (and category).

Thank you very much for your help in advanced, I'm just not understanding how you would go about it as a category need is an 'object' and needs to be added to a post object (that needs to be added to the database).

Upvotes: 4

Views: 4923

Answers (1)

dimakura
dimakura

Reputation: 7655

You PostsController#create method probably looks like this now:

def create
  @post = Post.new(post_params)

  respond_to do |format|
    if @post.save
      format.html { redirect_to @post, notice: 'Post was successfully created.' }
      format.json { render :show, status: :created, location: @post }
    else
      format.html { render :new }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end

and post_params is something like:

def post_params
  params.require(:post).permit(:title, :body)
end

I also assume you've already defined relationship between Category and Post and migrated database accordingly:

class Post < ActiveRecord::Base
  belongs_to :category
end

class Category < ActiveRecord::Base
  has_many :posts
end

What you require is to add ability to select Post's category on create and update. You need to make changes only in two places.

The first place is a form view/posts/_form.html.erb, where you add the following snippet inside form_for block:

<div class="field">
  <%= f.label :category_id %>
  <%= f.collection_select :category_id, Category.all, :id, :name %>
</div>

This will create a <select> tag with list of categories. Blogger can now select desired category when creating/updating his blog post.

The second place you need to make changes is post_params method in posts_controller:

def post_params
  params.require(:post).permit(:title, :body, :category_id)
end

Here you just declared :category_id as a safe parameter.

You can check now. Your forms should be fully functional now.

Note You probably need to display category in posts list as well (views/posts/index.html.erb). You can add the following column to existing table:

<td><%= post.category && post.category.name %></td>

Upvotes: 6

Related Questions