drallewellyn
drallewellyn

Reputation: 35

Act-As-Taggable not saving to database

Hi I am attempting to use act_as_taggable ruby gem and have followed the github guide and a recent tutorial as well as checked stack overflow for advice. My code all seems to be correct but when I attempt to save tags via my form partial or via the rails console they do not save to the database.

Below relevant code excerpts.

Thanks in advance for any help!

post.rb

class Post < ActiveRecord::Base
  acts_as_taggable
  acts_as_taggable_on :tags
  validates :title, presence: true, length: {minimum: 5}
  validates :body, presence: true
  extend FriendlyId
  friendly_id :title, use: :slugged

end

post_controller.rb

class PostsController < ApplicationController

  before_action :find_post, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  def index
    if params[:tag].present? 
      @posts = Post.tagged_with(params[:tag]).paginate(:page => params[:page], :per_page => 10)
    else
      @posts = Post.all.order('created_at DESC').paginate(page: params[:page], per_page: 10)
    end
  end

  def new
    @post = Post.new
  end

  def show
  end

  def create
    @post = Post.new(post_params)

    if @post.save
      redirect_to @post, notice: "Article succesfully saved!"
    else
      render 'new', notice: "Try Again. I was unable to save your post."
    end
  end

  def edit
  end

  def update

    if @post.update(params[:post].permit(:title, :body))
      redirect_to @post, notice: "Article succesfully edited!"
    else
      render 'edit'
    end
  end

  def destroy
    @post.destroy
    redirect_to posts_path
  end

  private

  def post_params
    params.require(:post).permit(:title, :body, :slug, :tag_list => [])
  end

  def find_post
    @post = Post.friendly.find(params[:id])
  end

end

routes.rb

Rails.application.routes.draw do

  devise_for :users, :skip => :registrations
  root 'pages#home'
  resources :posts
  resources :portfolios
  get 'tags/:tag', to: 'posts#index', as: :tag
end

_form.html.erb

<%= form_for @post do |f| %>
  <% if @post.errors.any? %>
    <div id="errors">
      <h2><%= pluralize(@post.errors.count, "error") %> prevented this post from saving:</h2>
      <ul>
        <% @post.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.label :title %><br>
  <%= f.text_field :title, class: 'form-control form-control-lg' %><br>
  <br>
  <%= f.label :body %><br>
  <%= f.text_area :body, class: 'form-control form-control-lg', :rows => "10" %><br>
  <br>
  <%= f.label :tag_list, "Tags (separated by commas)" %>
  <%= f.text_field :tag_list, class: 'form-control' %>
  <br>
  <%= f.submit %>
<% end %>

excerpt from show.html.erb

<% @post.tags.any? %>
   <% @post.tags.each do |tag| %>
   <li><a href="#"> 
      <%= link_to tag.name, tag_path(tag.name) %>
   </a></li>
<% end %>

Params log for _form as requested by Pavan:

Started PATCH "/posts/my-third-post-with-tags" for ::1 at 2015-09-23 15:56:36 +1000
Processing by PostsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"GwLMImKSDyhPt77nI+fhIkF4QVsFxMen851wjcVorrxOCdU+TcRKIZv1im4/oNx7DERYCI91vE9YDjvSda7MAg==", "post"=>{"title"=>"My third post with tags", "body"=>"to update your local repository to the newest commit, execute\r\ngit pull\r\nin your working directory to fetch and merge remote changes.\r\nto merge another branch into your active branch (e.g. master), use\r\ngit merge <branch>\r\nin both cases git tries to auto-merge changes. Unfortunately, this is not always possible and results in conflicts. You are responsible to merge those conflicts manually by editing the files shown by git. After changing, you need to mark them as merged with\r\ngit add <filename>\r\nbefore merging changes, you can also preview them by using\r\ngit diff <source_branch> <target_branch>", "tag_list"=>"tag, css"}, "commit"=>"Update Post", "id"=>"my-third-post-with-tags"}
  Post Load (0.1ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."slug" = ?  ORDER BY "posts"."id" ASC LIMIT 1  [["slug", "my-third-post-with-tags"]]
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
Unpermitted parameter: tag_list
   (0.0ms)  begin transaction
   (0.0ms)  commit transaction
Redirected to http://localhost:3000/posts/my-third-post-with-tags
Completed 302 Found in 4ms (ActiveRecord: 0.3ms)


Started GET "/posts/my-third-post-with-tags" for ::1 at 2015-09-23 15:56:36 +1000
Processing by PostsController#show as HTML
  Parameters: {"id"=>"my-third-post-with-tags"}
  Post Load (0.1ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."slug" = ?  ORDER BY "posts"."id" ASC LIMIT 1  [["slug", "my-third-post-with-tags"]]
  ActsAsTaggableOn::Tag Exists (0.1ms)  SELECT  1 AS one FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = ? AND "taggings"."taggable_type" = ? AND "taggings"."context" = ? LIMIT 1  [["taggable_id", 2], ["taggable_type", "Post"], ["context", "tags"]]
  ActsAsTaggableOn::Tag Load (0.1ms)  SELECT "tags".* FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = ? AND "taggings"."taggable_type" = ? AND "taggings"."context" = ?  [["taggable_id", 2], ["taggable_type", "Post"], ["context", "tags"]]
  Rendered posts/show.html.erb within layouts/application (3.2ms)
  Rendered layouts/_header.html.erb (496.3ms)
  Rendered devise/shared/_links.html.erb (0.2ms)
  Rendered devise/sessions/_new.html.erb (4.6ms)
  Rendered layouts/_slideoutpanels.html.erb (460.2ms)
  Rendered layouts/_footer.html.erb (0.0ms)
Completed 200 OK in 1486ms (Views: 1484.3ms | ActiveRecord: 0.2ms)

Upvotes: 1

Views: 255

Answers (1)

Florin Ionita
Florin Ionita

Reputation: 271

Your error is from PostsController#update as HTML

In controller you don;t permit tag_list

@post.update(params[:post].permit(:title, :body))

Upvotes: 1

Related Questions