Rails migration -- not appearing on show.html.erb - html

I had a model named b_page I wanted to create another column , so I ran a migration:
rails g migration add_status_to_b_page status:string
so migration was successful. Users should be able to update their status so I put this on the _form.html.erb:
<div class="field">
<%= f.label :status %><br>
<%= f.text_field :status %>
</div>
was successful but then i added it to the show.html.erb
<%= #b_page.status %>
but everytime i make a new b_page or edit the current one I dont see it on show.html.erb

Without seeing your code I guess you have to whitelist the new parameter (status) in your BPageController (at the very bottom, in something like def bh_pages_params).
You can check the logs whether the parameter that comes into your controller (via the form) actually arrives at the data (ActiveRecord Model), this whitelisting approach (called Strong Parameters) is in place to safe guard your data.

thx I fixed my problem I forgot to add status in
params.require(:b_page).permit(:Bpage_name, :banner_img, :profile_img, :status) in my controller

Related

Cannot edit a reference between two existing tables in Ruby on Rails via form

i have two tables in Ruby on Rails, Movies and Directors. Movies has belongs_to association to director, and director has has_many association to movies. I can create both just fine, but when i try to edit a movie to include its director via a dropdown(using form.collection_select) and click update i get this message:
1 error prohibited this movie from being saved:
Director must exist
This is the code for the dropdown (its labeled in my native language, sorry about that)
"
<%= form.label :director_id, "Režisér", style: "display: block" %>
<%= form.collection_select(:director_id, Director.all, :id, :first_name, {:prompt => 'Vyberte režiséra'}, :selected => #movie.director_id ) %>
"
I'm a newbie to Ruby on Rails and my search on this issue has so far been unsuccessful and i have no idea how to ask Mr Google correctly
solved thanks to max's comment below, i simply needed to add the director_id reference parameter to my movies_controller.rb like so:
def movie_params
params.require(:movie).permit(:name, :release_date, :description, :director_id)
end

How do I redirect the to index after submitting a new record at the front-end? [Rubymine 2020.2.3, Ruby.2.7.2p137, gem 3.1.2]

I am struggling with a college project course, and I have been stuck with this error for weeks now, despite the suggestions provided by colleagues and tutors.
In my create method for a given table. I am trying to have the page containing the forms for new record entries redirect back to the index page after saving. Instead, I get redirected to this error instead, highlighting #courier=Courier.new(courier_new_path) with the error stating that it is not a hash, and would not redirect me back into index. However, when manually searching the index, I see that the data string would indeed get updated.
I have tried renaming the path label, but Rubymine prompt suggestions appear limited, and any further deviation would cause a different error
The following is the create method in the controller page (courier_controller.rb):
def create
#courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email))
#courier.save
redirect_to courier_path(#courier)
#courier=Courier.new(courier_new_path)
if #courier.save
redirect_to(:controller=>'courier' ,:action=>'index')
else
render('new')
end
end
Here is the code for the form page (courier/new/html.erb):
<h1>Courier#new</h1>
<p>Find me in app/views/courier/new.html.erb</p>
<%= form_with scope: :courier, :url => {:action => 'create'}, local: true do |f| %>
<p>
<%= f.label :courier_name %><br/>
<%= f.text_field :courier_name %>
</p>
<p>
<%= f.label :courier_email %><br/>
<%= f.text_field :courier_email %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
I have tried renaming #courier as Courier.new(courier_create_path) or Courier.nww(courier_path), I have tried looking for arguments using a hash form, but none seemed equivocal nor translatable as a solution to my problem.
Any suggestions would help. This is part of a college project, and as a multimedia student not as savvy in programming compared to fellow peers, I would highly appreciate suggestions that I can try out.
Many thanks in advance.
Has anyone tried to explain what is actually going on in your create method? I've added comments after each line to say what that line is doing.
def create
#courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email))
# use the params to build a new courier record (the permit part is usually in a separate method that other methods can access but it works this way)
#courier.save
# Save the new courier record to the database
redirect_to courier_path(#courier)
# Send the user back to the "show" page of the courier record (not index!)
#courier=Courier.new(courier_new_path)
# this makes no sense, you are trying to create a new courier object using a path method
# Basically you are saying: #courier = Courier.new('/courier/new')
if #courier.save
#you are trying to save this record that will fail because you can't create a courier by passing it a url
redirect_to(:controller=>'courier' ,:action=>'index')
#send the user to the index page of the courier views.
else
render('new')
#something went wrong so go back to the new courier form.
end
end
When your program gets to line 4 redirect_to courier_path(#courier) it is going to exit the create method and send the user to http://my_app:3000/couriers/1 where the number 1 would be the ID in the database of the record you just created. This would relate to the file in your app in app/views/couriers/show.html.erb. It sounds like you want to get to http://my_app:3000/couriers which presents the user with the file app/views/couriers/index.html.erb Not sure why you are doing anything after that line.
Also it is unclear what error you are getting. You need to look at your webserver console, the place where you run "rails s" that shows all the communications between the browser and your app. find the stack trace that starts with the actual error, and add that to your question above (don't paste it in a comment, it will be too long and impossible to read).
I think you just need:
def create
#courier=Courier.new(params.require(:courier).permit(:courier_name,:courier_email))
if #courier.save
redirect_to #courier #if you want to redirect to their 'show" page
else
render('new')
#something went wrong so go back to the new courier form.
end
end
What might be confusing to a new programmer is that Rails is doing so much "magic" behind the scenes it gets very confusing if you don't already know the underlying concepts happening behind the scenes. You are saying redirect_to(:controller=>'courier' ,:action=>'index') which specifically says "go to the index page of the couriers" but you can say redirect_to #courier and it will assume that you want to go to the page that shows the record of the courier you just created. If you really want to go the table that shows all of the couriers you would replace that with redirect_to :couriers The symbol :couriers tells it to go to the index method of the couriers controller.

Rails not indexing locations

So I tried to add this code to first the views and then the controller. It didn't work and gave me an error : undefined method save for 4:Fixnum.
Code:
<% unless location.user.interests.blank? %>
<% #merged_array = location.user.interests.split(',').uniq +
current_user.interests.split(',').uniq %>
<% location.score = #merged_array.length - #merged_array.uniq.length %>
<% location.score.save %>
<% else %>
<% location.score = 0 %>
<% location.score.save %>
<% end %>
But then I removed it from both controller and views..... Now the index page isn't showing the locations at all I checked and the show page is working and records still exist
This is really not the way it should work.
Just read a bit about the MVC pattern - it's worth it!
You shouldn't check in production credentials into your repository - especially not if it is public.
Checkout https://github.com/bkeepers/dotenv to keep your keys and passwords privately.
You should change your passwords immediately!
The error you got is because location.score is an integer not an object - location.save! will save the object with its new score.
PS: You don't want to be the guy who let production creds into the guide for new employees. https://www.reddit.com/r/cscareerquestions/comments/6ez8ag/accidentally_destroyed_production_database_on/
Beside of that, Keep going!
Sorry forgot that it only displays locations within a 50 mile radius and i was travelling...... Silly me :)

How to hide html areas depending on user in Rails 4?

I have a checkout button on my product page show view which accepts the offer. Each offer belongs_to a user. I don't want the user who created the offer to be able to accept it themselves so if it is the current user on the page I want to hide the button. I can't figure out why this code doesn't work:
<% unless current_user.id == #offer.sender_id %> #sender_id is a foreign key in the offer model that makes each offer belong_to a user.
<div id="accept_offer">
<%= button_to 'Accept Offer', etc %>
</div>
<% end %>
current_user is a devise gem method I believe.
Any help appreciated.
your code seems correct, you maybe need to look into your Offer.sender_id attribute in the model to see if it contains the right user id (of the creator of the offer). You could check that by creating a new offer throught your application (in the browser) then, in the console you type:
Offer.last.sender_id
And check if it corresponds to your current_user id
Just saw the error and got the reason.
You tried the page without sign in so unless current_user works, this means you have not signed in. Your original code doesn't considered this case.
Generally you should see an error as current_user is not defined but you may have disabled that.
Two ways to fix:
Change current_user, assign an object in any case
class ApplicationController
def current_user
super || User.new
end
end
Change the logic
<% if current_user && current_user != #obj.sender %>
# Button code
# Only signed in user with different id can see it

schema.rb and mysql database issue in ruby on rails

First of all, I've been learning Rails for 8 months but feel like I started yesterday, so please bear with me. I'm trying to resolve why my value, called visible, isn't functioning correctly. I'm using Simple_form. 'visible' is the radio button value:
<div class='review-form'>
<%= simple_form_for(#review) do |f| %>
# input boxes for current_user to put text here
#'public' radio button, checked by default, class is for css
<%= f.radio_button :visible, "true" , :class => "share_button" %>
#'private' radio button, class is for css
<%= f.radio_button :visible, "false", :class => "keep_private_button" %>
#user can cancel
<%= link_to I18n.t('write_review.cancel_button'), landing_page,
:class => 'btn' %>
#user can submit
<%= f.button :submit, I18n.t('write_review.submit_button'),
:class => 'btn btn-primary' %>
The idea is that the current_user writes a review - if they make it 'public', any other user can see it, if private, only they can see it. The radio buttons work ok - when I log out, look at the app on different machines etc, the radio button is in the last saved state. The problem is that the current review, #review, is always visible to everybody, regardless of the state of the radio button.
I put <%= #review.visible? %> on the review form. Every time I refresh the page it is 'true', even though the radio button might be false. I save the review and #review.visible then matches accordingly. But then I refresh and it goes back to true.
I think the problem could be:
In my schema.rb I have:
t.boolean "visible", :default => true
I deleted :default => trueand there was no improvement but I hear you're not supposed to manually interfere with the schema.rb anyway.
Do you think that default => true is causing the problem? Would doing a 'migration' be the way to go? How would I word that 'default => true' part in the migration?
Finally, while my schema.rb has 'boolean' my actual database has visible: tinyint(1) , which I thought was fishy, but I've read online they're in fact the same thing, so I don't think that's the problem - if you think differently, let me know.
You shouldn't touch db/schema.rb. That is automatically updated via the migrations and/or the state of your database. You have the right idea in that you need to remove the default value for 'visible', but you need to do it in a migration. change_column_default is probably what you want.
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default
Also, the boolean vs tinyint(1) is okay. It's a MySQL thing as MySQL doesn't have true boolean types.
To echo what Phillip said if you need to change your database, you shouldn't do it via schema.rb, you need a migration. You should have a default for booleans on mysql (because otherwise it's a tri-state instead of a binary (true, false, null).
If you think the problem is the default is wrong, you can do a change_column migration, you can generate a migration from the command line tools:
rails g migration UpdateTableName
Open the migration file (in models/db/migrate/timestamp_update_table_name.rb) and change the code to be:
def change
update_column :table_name, :columnname, :boolean, :default => false
end
then run this via command line tools:
rake db:migrate
If you think your problem is the form, you could always look at something like this to see if it's the values for your form that are the problem.