Imgur Clone: error "param missing or value is empty" - ruby-on-rails

I'm re-doing an assignment that is a clone of Imgur.
I tried adding a picture to the database with an artist, title and URL: but now I have an error stating my param are missing or the value is empty. I've searched and searched and I'm not getting any closer.
Here is my pictures_controller.rb:
class PicturesController < ApplicationController
def index
#picture = Picture.all
end
def show
#picture = Picture.find(params[:id])
end
def new
#picture = Picture.new
end
def create
#picture = Picture.new(picture_params)
if #picture.save
redirect_to pictures_url
else
render :new
end
end
def edit
#picture = Picture.find(params[:id])
end
def update
#picture = Picture.find(params[:id])
if #picture.update_attributes(picture_params)
redirect_to "/pictures/#{#picture.id}"
else
render :edit
end
end
def destroy
#picture = Picture.find(params[:id])
#picture.destroy
redirect_to pictures_url
end
private
def picture_params
params.require(:picture).permit(:artist, :title, :url)
end
end
I really appreciate your help, all. I'm completely stumped! And it's probably something really small, as usual :-\ Thank you.

Related

Data cannot be saved to database the first time

I have this code, it works perfectly for me, the problem is that it does not save me in the database the first time, I must reload the page and then try again to make it work.
I can't find the error
then I am going to leave you the code of my controller so that you can give me a hand of what may be happening
class EvolutionsController < ApplicationController
before_action :load_patient
before_action :set_evolution, only: :show
before_action :verify_permission, only: %i[new show create edit update destroy]
def index
#evolutions = #patient.evolutions # You could skip this and just use #patient.evolutions in your view if you like
end
def show
end
def new
#evolution = #patient.evolutions.build
end
def create
#evolution = #patient.evolutions.build(evolution_params)
if #evolution.save
redirect_to patients_url, notice: 'La evolucion fue agregada con exito'
else
render :new
end
end
def edit
end
def destroy
#evolution = #patient.evolutions.find(params[:id])
#evolution.destroy
redirect_to patient_path(#patient)
flash[:notice] = "EvoluciĆ³n eliminada"
end
private
def load_patient
#patient = Patient.find(params[:patient_id])
end
def set_evolution
#evolution = #patient.evolutions.find(params[:id])
end
def verify_permission
redirect_to patients_path if !user_signed_in? || #patient.user != current_user
end
def evolution_params
params.require(:evolution).permit(:motivo, :entrevista, :patient_id)
end
end

Ruby on Rails #article.id and#article.category_id keep getting switched

Can someone tell me why id and category_id keep getting switched in Rails?? im losing my mind! the console says its correctly but when i get an error it shows that params switches it around. This my controller below:
class ArticlesController < ApplicationController
def new
#article = Article.new
#category = Category.find(params[:category_id])
end
def create
#article = Article.new(articles_params)
#category = Category.find(params[:category_id])
# binding.pry
#article.category_id = #category.id
binding.pry
if #article.save
redirect_to category_path(#category)
else
render :new
end
end
def edit
#category = Category.find(params[:category_id])
#article = Article.find(params[:id])
end
def update
#article = Article.find(params[:id])
#category = Category.find(params[:category_id])
if #article.update(articles_params)
redirect_to category_path(#category)
else
render :edit
end
end
def destroy
# binding.pry
#article = Article.find(params[:id])
#article.destroy
redirect_to category_path(#category)
end
private
def articles_params
params.require(:article).permit(:title, :body)
end
end
Everything looks fine.
Look below on the request parameters from your screenshot:
{
"id" : 1,
"category_id" : 2
}
You are looking for id 1 in the context of your Article controller.
1 refers to the article with id 1.
Meanwhile you are looking for a Category with id 2 (category_id 2).
Category.find(params[:category_id])
The error is saying that it cannot find a Category object with id 2.
The 2 comes from your request. If something is wrong, it's in your request creation.

ActiveModel::ForbiddenAttributesError while creating a new entry

I am new to Ruby on Rails and I was trying to create a simple app when I ended up having a ActiveModel::ForbiddenAttributesError
class PostsController < ApplicationController
def index
#posts = Post.all
end
def show
#post = Post.find(params[:id])
end
def new
#post =Post.new
end
def create
#post = Post.new(params[:post])
if #post.save
redirect_to post_path,:notice=>"success"
else
render "new"
end
end
def edit
end
def update
end
def destroy
end
private
def post_params
params.require(:post).permit(:Title, :content)
end
end
I have seen a similar error here but the solution for that did not fix my issue.
My version of rails is 4.2.0.
The error displayed is
You can't use that params[:post] hash (or any params[*] hash) directly in any mass-assignment method, you need to use a permit call so Rails knows you've checked it and to allow it.
So, change your Post.new to #post = Post.new(post_params)
Change #post = Post.new(params[:post]) to #post = Post.new(post_params).
I think that
def create
#post = Post.new post_params
if #post.save
flash[:success] = "Created new post"
redirect_to #post
else
render 'new'
end
end
def create
#post = Post.new(posts_params)
if #post.save
redirect_to post_path,:notice=>"success"
else
render "new"
end
end
private
def posts_params
params.require(:post).permit(:Title, :content)
end

Web scraping information from different websites

Im using a gem called MetaInspector to scrape data from different websites. Im building a site where i can collect data from different sites but am having trouble setting up. I have a model called site with a title and a url both strings. When i create a new "site" the name will come out as example.com/"sitename" and in there i would like to have the data just from that site. I kinda have an idea to this by adding page = MetaInspector.new to the new method but cant see how i can set a url in there.
I can show my controller and other info if needed.
Controller
class Admin::SitesController < Admin::ApplicationController
def index
#sites = Site.all
end
def show
#site = Site.friendly.find(params[:id])
end
def edit
#site = Site.friendly.find(params[:id])
end
def update
#site = Site.friendly.find(params[:id])
if #site.update(site_params)
redirect_to admin_path
else
render :edit
end
end
def destroy
#site = Site.friendly.find(params[:id])
#site.destroy
if #site.destroy
redirect_to admin_path
end
end
def new
#site = Site.new
end
def create
#site = Site.new(site_params)
if #site.save
redirect_to admin_path
else
render :new
end
end
private
def site_params
params.require(:site).permit(:title, :url)
end
end
If I understand correct you want to show the metainfo for a Site you have added. You could put that code in the show action of the controller:
def show
#site = Site.friendly.find(params[:id])
#page = MetaInspector.new(#site.url)
end
And update the show.html.erb template to display info about #page, ie:
<%= #page.title %>

Ruby on rails 4 attr_accessible

I am trying to access the database and enter some info. it gives me an error saying "undefined local variable or method `post_params' for #< PostsController:0x00000005aad728>"
i know this has been answered here.
but i tried following what they did, and it just does not work, can someone help me with this?
class PostsController < ApplicationController
def index
#post = Post.all
end
def show
#post = Post.find(params[:id])
end
def new
#post = Post.new
end
def create
#post = Post.new(post_params)
if #post.save
redirect_to posts_path, :notice => "Your post was saved"
else
render ="new"
end
private
def post_params
params.require(:post).permit(:title, :content)
end
end
end
Your end for create method is enclosing the private keyword and post_params method. Update it as:
def create
#post = Post.new(post_params)
if #post.save
redirect_to posts_path, :notice => "Your post was saved"
else
render ="new"
end
end # Add end here
private
def post_params
params.require(:post).permit(:title, :content)
end
end # Remove this end
You define your post_params method inside of create method. Move it outside of it and all will be working.

Resources