Unknown action The action 'create' could not be found for PostsController - ruby-on-rails

class PostsController < ApplicationController
def index
end
def new
end
def Create
#post = Post.new(post_params)
#post.save
redirect_to #post, :notice=> "created"
end
private
def post_params
params.require(:post).permit(:title, :body)
end
end

You need to have your methods lowercase. Change Create to create.

Related

Friendly_id not showing up on rails

Hi guys im creating blog with friendly id, but its not working..
The problem is when i tried to edit the title, friendly id came up, but when i reopen, it just show the blog id. not the slug anymore
this is the code
in my model :
class Blog < ApplicationRecord
extend FriendlyId
friendly_id :title, use: :slugged
def should_generate_new_friendly_id?
slug.blank? || title_changed?
end
end
my blog controller
class BlogsController < ApplicationController
before_action :set_blog, only: [:show, :edit, :update, :destroy]
def index
#blogs = Blog.all
end
def show
#blog = Blog.friendly.find(params[:id])
end
def new
#blog = Blog.new
end
def create
#blog = Blog.new(blog_params)
if #blog.save
redirect_to blog_path(#blog), notice: "Successfully Created"
else
render :new
end
end
def edit
end
def update
if #blog.update(blog_params)
redirect_to blog_path(#blog), notice: "Successfully Update"
else
render 'edit'
end
end
def destroy
#blog.destroy
redirect_to blog_path(#blog)
end
private
def set_blog
#blog = Blog.friendly.find(params[:id])
end
def blog_params
params.require(:blog).permit(:title, :body, :image, :category_id)
end
end
i spent so much time to solve this.. please help

NameError in PostsController#create undefined local variable or method `post_params' for #<PostsController:0x007fd289176ae8>

Posts Controller
class PostsController < ApplicationController
def index
end
def new
#post = Post.new
end
def create
#post = Post.new(post_params)
if #post.save
redirect_to #post
else
render `new`
end
end
def show
#post = Post.find(params[:id])
end
private
def post post_params
params.require(:post).permit(:title, :body)
end
end
Here your method name is post and it takes an argument post_params. But in your code you intend to use post_params as the method name.
So change this:
def post post_params
params.require(:post).permit(:title, :body)
end
to:
def post_params
params.require(:post).permit(:title, :body)
end
You have a type here:
def post post_params
params.require(:post).permit(:title, :body)
end
Remove post:
def post_params
params.require(:post).permit(:title, :body)
end

How to get a timeline of posts of only people someone follows

I'm trying to do something like Instagram where you can see images of people you only follow. A user can follow another user and create new posts.
This is what i have for following and unfollowing in my Users controller.
def following
#user = User.find(params[:id])
current_user.mark_as_following #user
respond_to do |format|
format.html {redirect_to #user}
format.js
end
end
def unfollow
#user = User.find(params[:id])
#user.unmark :following, :by => current_user
respond_to do |format|
format.html {redirect_to #user}
format.js
end
end
Here is my my Posts controller
class PostsController < ApplicationController
load_and_authorize_resource
def show
#post = Post.find(params[:id])
end
def new
#post = Post.new
end
def create
#post.user_id = current_user.id
if #post.save
redirect_to #post
else
render :new
end
end
def edit
#post = Post.find(params[:id])
end
def update
#post = Post.find(params[:id])
if #post.update_attributes(update_params)
redirect_to #post
else
render :edit
end
end
private
def update_params
params.require(:post).permit(:caption, :image)
end
def create_params
params.require(:post).permit(:caption, :user_id, :image)
end
end
you can create a controller like this
class FollowingPostsController < ApplicationController
def index
#posts = current_user.following_posts
end
end
and in your User model
class User < ActiveRecord::Base
def following_posts
#assuming that following_users returns the list of following users
self.following_users.map{ |user| user.posts }.flatten(1)
end
end
Or you can get the list of posts with :
Post.where(user_id: self.following_users.ids)

Create a post as a user and assign it to a group

In my rails application I have made three models, User, Group and Post.
I am trying to make it so that #post.group is equal to #group.id
The post is posted from a render inside of the group#show controller and then redirects itself to the post#create controller. How do I set the #post.group to #group.id?
GroupsController
class GroupsController < ApplicationController
before_action :set_group, only: [:show, :edit, :update, :destroy]
respond_to :html
def index
#groups = Group.all
respond_with(#groups)
end
def show
#group_id = #group.id
respond_with(#group)
end
def new
#group = Group.new
respond_with(#group)
end
def edit
end
def create
#group = Group.new(group_params)
#group.save
respond_with(#group)
end
def update
#group.update(group_params)
respond_with(#group)
end
def destroy
#group.destroy
respond_with(#group)
end
private
def set_group
#group = Group.find(params[:id])
end
def group_params
params.require(:group).permit(:name, :description, :motto, :usercount, :group, :id, :groupid)
end
end
PostsController
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]
respond_to :html
def index
#posts = Post.all
respond_with(#posts)
end
def show
respond_with(#post)
end
def new
#post = Post.new
respond_with(#post)
end
def edit
end
def create
#post.group = #group_id
#post = Post.new(post_params)
#post.save
respond_with(#post)
end
def update
#post.update(post_params)
respond_with(#post)
end
def destroy
#post.destroy
respond_with(#post)
end
private
def set_post
#post = Post.find(params[:id])
end
def set_group
#group = Group.find(params[:id])
end
def post_params
params.require(:post).permit(:body, :group, :id)
end
def group_params
params.require(:group).permit(:id, :groupid, :group)
end
end
PostModel
class Post < ActiveRecord::Base
belongs_to :group
end
GroupsModel
class Group < ActiveRecord::Base
has_many :posts
end
The current code that I have returns the error undefined methodgroup=' for nil:NilClass`
Any help is appreciated!
You should start from creating Post instance, because you don't do this. I would do it like this:
def create
#post = #group.posts.build(post_params)
if #post.save
# handle success
else
# handle error
end
end
What's more, you should set before_action :set_group in your PostsController.

Nested Resorces :forbdden attributes

I am new in rails and I am getting ActiveModel::ForbiddenAttributesError. This is my controller for nested resource:
class PostsController < ApplicationController
respond_to :html, :xml, :json
def index
#post=Post.all
end
def new
#user = User.find(params[:user_id])
#post = #user.posts.build
respond_with(#post)
end
def create
debugger
#user = User.find(params[:user_id])
#post = #user.posts.build(params[:post])
if #post.save
redirect_to user_posts_path
else
render 'new'
end
end
def post_params
params.require(:post).permit(:title, :description, {:user_ids =>[]})
end
end
If you have the following models:
post.rb
class Post < ActiveRecord::Base
belongs_to :user
end
user.rb
class User < ActiveRecord::Base
has_many :posts
end
You don't actually need to use nested attributes, just do the following in your controller:
class PostsController < ApplicationController
respond_to :html, :xml, :json
def index
#post = Post.all
end
def new
#post = Post.new
respond_with(#post)
end
def create
#user = User.find(params[:user_id])
#post = #user.posts.new(post_params) # This will automatically set user_id in the post object
if #post.save
redirect_to user_posts_path
else
render 'new'
end
end
def post_params
params.require(:post).permit(:title, :description)
end
end
Although I don't recommend that you user a user_id param in the url. Have a look at the devise gem to handle authentication.

Resources