Accepts nested attribute form for has_one not populating - ruby-on-rails

I created a Preference model to manage email settings. Right now, the nested form is not showing up on the actual page. I tried a series of different tactics, but can't figure it out.
I made sure I had preferences locally set up, changed the fields_for to (#user.preference) which didn't work, etc.
I'm using Rails 4.2.2, Ruby version 2.2.1.
schema
create_table "preferences", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id", null: false
t.boolean "new_match", default: true, null: false
t.boolean "accepted_match", default: true, null: false
t.boolean "match_reminder", default: true, null: false
t.boolean "new_message", default: true, null: false
end
user model
has_one :preference, dependent: :destroy
accepts_nested_attributes_for :preference
preference model
class Preference < ActiveRecord::Base
belongs_to :user
end
actual form that has contains the partials to the nested form:
<%= form_for(#user, id: "editing-info") do |f| %>
<ul class="tabs">
<li class="tab-link current" data-tab="tab-account">
<%= t("edit_user.tabs.account") %>
</li>
<li class="tab-link" data-tab="tab-interests">
<%= t("edit_user.tabs.interests") %>
</li>
<li class="tab-link" data-tab="tab-settings">
<%= t("edit_user.tabs.settings") %>
</li>
</ul>
<div class="tab-content current" id="tab-account">
<%= render "users/tabs/account", f: f %>
</div>
<div class="tab-content" id="tab-interests">
<%= render "users/tabs/interests", f: f %>
</div>
<div class="tab-content" id="tab-settings">
<%= render "users/tabs/settings", f: f %>
</div>
<div id="button-container">
<%= link_to 'Cancel',
user_path(current_user),
data: { disable_with: "Loading..." },
class: "cancel-desktop" %>
<%= f.submit "Save",
data: { disable_with: "Loading..." },
class: "save main-save-button-edit" %>
</div>
<% end %>
partial that includes nested form
<div id="settings">
<h4 class="notifications-label">Notifications</h4>
<div class="notifications setting-category info-holder">
<div class="mobile setting-holder">
<%= f.label :mobile, "Mobile", class: "setting-label" %>
<%= f.text_area :mobile, placeholder: "Add mobile number", class: "setting-input" %>
</div>
<div class="email-holder setting-holder main-email-edit">
<%= f.label :email, "Email", class: "setting-label" %>
<%= f.text_area :email, placeholder: "Add email address", class: "setting-input" %>
</div>
<p class="setting-descrip">This email is where Glassbreakers notifications will be sent. Please continue to use your email associated with your LinkedIn account to sign in.</p>
</div>
<h4 class="email-label">Emails</h4>
<%= f.fields_for :preference do |user_preference| %>
<div class="email-notifications-holder">
<div class="email-holder">
<%= user_preference.label :new_match, "Getting a new match each week" %>
<%= user_preference.check_box :new_match, class: "checkbox new_match_email" %>
</div>
<div class="email-holder">
<%= user_preference.label :match_reminder, "New matches Thursday reminder", class: "match_reminder_email" %>
<%= user_preference.check_box :match_reminder, class: "checkbox thursday_reminder_email" %>
</div>
<div class="email-holder">
<%= user_preference.label :accepted_match, "A Glassbreakers accepted a match", class: "accepted_match_email" %>
<%= user_preference.check_box :accepted_match, class: "checkbox accept_match_email" %>
</div>
<div class="email-holder">
<%= user_preference.label :new_message, "Received a new message" %>
<%= user_preference.check_box :new_message, class: "checkbox new_message_email" %>
</div>
</div>
<% end %>
<h4 class="connect-label">Connections</h4>
<div class="connections info-holder">
<p class="inform">You'll receive new matches every Tuesday. Make sure to respond to your matches before then.</p>
<div class="pausing">
<label><%= t("edit_user.settings.pausing_header") %></label>
<%= react_component(
"MatchingPausedSetting",
{
matchingPaused: current_user.matching_paused?,
pauseMatchingURL: user_matching_pauses_path(current_user)
}
) %>
</div>
<p class="setting-descrip pause-descrip">Pausing connections means you will not receive new potential connections each week. You will be able to send and receive new messages.</p>
</div>
<h4 class="contact-label">Contact</h4>
<div id="contact-info" class="info-holder">
<p class="inform">Have a question? We love hearing from you. Contact Courtney, our communication manager, at info#glassbreakers.co.</p>
</div>
</div>
user controller pertaining to the user_params
def user_params
filtered_params = params.require(:user).permit(
:email,
:mobile,
:bio_because,
:bio_meet,
:description,
:github_link,
:linkedin_link,
:title,
:twitter_link,
preference_attributes: [
:id,
:new_match,
:accepted_match,
:match_reminder,
:new_message,
],
user_onboard_skills_attributes: [
:skill_id,
:industry_id,
:years_experience,
:id,
:_destroy,
],
interest_ids: [],
)
filtered_params[:user_onboard_skills_attributes] =
filter_user_onboard_skills_attributes(
filtered_params[:user_onboard_skills_attributes]
)
filtered_params
end

If your nested form is actually within the user form itself, adjusting your fields_for declaration like so should do the trick:
<%= f.fields_for #user.preference do |preference_fields| %>
Also note that I renamed the block variable to preference_fields from f, as it looks like you are already using f for your parent form.
The documentation has great explanation of this method, which should answer any additional questions:
fields_for documentation
Edit for posterity:
The fields weren't correctly displaying because your User model did not have an associated Preference model, this can be fixed by manually associating a preference model to the User, or by utilizing a strategy similar to the one found in this question: Rails: Create association if none is found to avoid nil errors. Pre-cautions are taken at the model level to ensure the association is created whenever a new User is created.

You cannot get both fields for user and preferences using 'f'.
you need to get fields_for preferences using
<%= f.fields_for :preference do |user_preference| %>
and for preferences field you will use user_preference

Related

Store data from one table to another in rails

I have a fundings table and organisations table. Fundings table has organisation_id. In fundings table I have fields that are same with organisations table. What I want is when application is created and on funding show page there is a add button to add all fields that are same in fundings and organisations table gets stored in organisations table as well. Please help
_form.html.erb (funding_form)
<%= form_for([#parent, #child, #funding], :html => {class: "form-horizontal",role: "form"}) do |form| %>
<div class = "form-group">
<div class="control-label col-sm-2">
<%= form.label :activity_details, class: "required" %>
</div>
<div class="col-sm-8">
<%= form.text_area :activity_details, required: true %>
</div>
</div>
<!--Adding organisation -->
<div class = "form-group">
<div class="control-label col-sm-2">
<%= form.label :name_of_organisation, id: "name_of_organisation-label" %>
</div>
<div class="col-sm-8">
<%= form.text_field :name_of_organisation, class: "form-control hidden", id: "name_of_organisation-textfield" %>
</div>
</div>
<div class = "form-group">
<div class="control-label col-sm-2">
<%= form.label :address, id: "address-label" %>
</div>
<div class="col-sm-8">
<%= form.text_field :address, class: "form-control hidden", id: "address-textfield" %>
</div>
</div>
<div class = "form-group">
<div class="control-label col-sm-2">
<%= form.label :city, id: "city-label" %>
</div>
<div class="col-sm-8">
<%= form.text_field :city, class: "form-control hidden", id: "city-textfield" %>
</div>
</div>
<div class = "form-group">
<div class="control-label col-sm-2">
<%= form.label :province, id: "province-label" %>
</div>
<div class="col-sm-8">
<%= form.text_field :province, class: "form-control hidden", id: "province-textfield" %>
</div>
</div>
<!-- End Adding organisation -->
<div class="form-group">
<div class="col-sm-10">
<%= form.submit "Apply", class: 'btn btn-primary btn-lg' %>
</div>
</div>
</div>
</div>
<% end %>
show.html.erb(funding show page)
<p>
<strong>Name of Organisation:</strong>
<%= #funding.name_of_organisation %></p><br>
<p>
<strong>Address:</strong>
<%= #funding.address %></p><br>
<p>
<strong>City:</strong>
<%= #funding.city %></p><br>
<p>
<strong>Province:</strong>
<%= #funding.province %></p><br>
<p>
<% if current_user.admin? %>
<%= link_to 'Add Organisation', "" %>
<% end %>
if admin clicks on add organisation fields get added to organisation table.
schema funding table
t.text "activity_details"
t.string "city"
t.string "name_of_organisation"
t.string "province"
t.text "address"
schema organisations table
t.string "name_of_organisation"
t.text "address"
t.string "city"
t.string "province"
funding.rb
belongs_to :organisation
organisation.rb
has_many :fundings
organisations controller
I have a new and create method to create organisation by the admin directly.so i have added a new_org method to get add the organisation from the funding table. But I am not able to find out how to implement it.
def new_org
#organisation = Organisation.new
end
def create_org
#organisation = Organisation.new(organisation_params)
if #organisation.save
flash[:success] = "Organisation is added"
redirect_to main_admin_service_provider_path
else
render 'new'
end
end
Something like this should work:
app/controllers/fundings_controller.rb
class FundingsController < ApplicationController
before_action :set_funding, on: %i[show add_organisation]
# ...
def update_organisation
return head :forbidden unless current_user.admin?
# assuming funding always has an organisation
whitelist = %w[your field names]
#funding.organisation.update!(#funding.attributes.slice(*whitelist))
redirect_to #funding, notice: 'fields successfully added to organisation'
end
# ...
private
def set_funding
#funding = Funding.find(params[:id])
end
end
config/routes.rb
Rails.application.routes.draw do
# ...
resources :fundings, only: :show do
# using patch because we are updating an existing resource
# but you can change this to whatever you like
patch 'update_organisation', on: :member
end
# ...
end
app/views/fundings/show.html.erb
<% if current_user.admin? %>
<%= link_to 'Add Organisation', update_organisation_funding_path(#funding), method: :patch %>
<% end %>
Alternatively you can update all double fields (without whitelisting) using the following code:
double_attribute_names = #funding.attribute_names & #funding.organisation.attribute_names
#funding.organisation.update!(#funding.attributes.slice(*double_attribute_names)
However keep in mind that this may produce unwanted results. For example some fields you don't want to update like 'id', 'created_at', 'updated_at' are most likely present on both instances, and maybe some custom double fields.
This can be resolved by creating a blacklist to exclude those fields:
blacklist = %w[id created_at updated_at]
double_attribute_names = #funding.attribute_names & #funding.organisation.attribute_names
#funding.organisation.update!(#funding.attributes.slice(*double_attribute_names).except(*blacklist))
But generally speaking it's better to whitelist.
This is not a good way to do it but you can define a hidden form with hidden fields with values of #funding.x on show page by defining
#organization = Organization.new in show method on Fundings.controller then you can simply post it as normal form. Or you can show this form to only admins.

undefined method `first_name' for #<Profile id: nil>

Trace: https://i.gyazo.com/6487f4eee162e8c2207d7fdb5fc4ef3b.png
I can't get what's happening, I did the same process with the contact page and everything worked fine. Any ideas?
profile/new.html.erb
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="text-center">Create Your Profile</h1>
<p class="text-center">Be a part of the DevMatch community and fill out your profile!</p>
<div class="well">
<%= render 'form' %>
</div>
</div>
</div>
profile/_form.html.erb
<%= form_for #profile, url: user_profile_path do |f| %>
<div class="form-group">
<%= f.label :first_name %>
<%= f.text_field :first_name, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :last_name %>
<%= f.text_field :last_name, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :job_title %>
<%= f.select :job_title, ['Developer', 'Entrepreneur', 'Investor'], {}, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :phone_number %>
<%= f.text_field :phone_number, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :contact_email %>
<%= f.text_field :contact_email, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.label :description %>
<%= f.text_area :description, class: 'form-control' %>
</div>
<div class="form-group">
<%= f.submit "Update Profile", class: 'btn btn-primary' %>
</div>
<% end %>
schema
create_table "profiles", force: :cascade do |t|
t.integer "user_id"
t.string "first_name"
t.string "last_name"
t.string "job_title"
t.string "phone_number"
t.string "contact_email"
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Profiles controller
class ProfilesController < ApplicationController
# GET to /users/:user_id/profile/new
def new
# Render blank profile details form
#profile = Profile.new
end
end
I get the rror in the profile creator page. It says the firstname is undefined but I tried deleting it and then it says that the laast name is undefined and so on
If I delete the "<%= render 'form' %>" form the other html, the page loads perfectly, but I need a form and I am trying to learn Ruby. Sorry
undefined method `first_name' for Profile id: nil
It says the firstname is undefined but I tried deleting it and then it
says that the last name is undefined and so on
You didn't have columns in the profiles table. You should run rake db:migrate to migrate the columns which should resolve your problem.
Additionally always make sure your migrations are run properly without any errors You check the status of the pending migrations with rake db:migrate:status

Rails grab input value on submit in controller

I have a customer model that belongs to user. However, when creating the new customer, the user will not be signed in. Instead I will be assigning the user based on his name attribute.
Here is the customer migration:
create_table :customers do |t|
t.belongs_to :user
t.string :name, null: false
t.date :install_date, null: false
t.decimal :mmr, null: false
t.boolean :sixty_month, default: false
t.boolean :eft, default: false
t.boolean :activation, default: false
t.timestamps
end
I then have a new customer form:
<h1>Create Customer</h1>
<%= form_for #customer do |f| %>
<div>
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div>
<%= f.label :install_date %>
<%= f.date_field :install_date %>
</div>
<div>
<%= f.label :mmr %>
<%= f.number_field :mmr %>
</div>
<div>
<%= f.label :sixty_month %>
<%= f.check_box :sixty_month %>
</div>
<div>
<%= f.label :eft %>
<%= f.check_box :eft %>
</div>
<div>
<%= f.label :activation %>
<%= f.check_box :activation %>
</div>
<div>
<%= f.label :users_name %>
<%= f.text_field :users_name %>
</div>
<%= f.submit 'Create Customer' %>
<% end %>
I need to get the users_name field and match it with the associated user and take that users id and assign it to the customers :user_id attribute. In the customers controllers create action so far I have:
#customer.user_id = User.where("name = #{}").id
I need to pull to input from the users_name field in the new customer form and put it into the above code somehow. I just don't know how haha. All help is appreciated!
You will probably want to move this out of the controller and into a helper method but you could do like this:
def create
#customer = Customer.new(customer_params)
if params[:users_name]
user = User.find_by(name: params[:users_name])
#customer.user_id = user.id unless user.nil?
end
if #customer.save
flash[:success] = "Customer created!"
redirect_to #customer
else
render 'new'
end
end
This is assuming you are using Rails 4.

How come some of my user fields get remember & pre-populated and others don't?

I am working on an app where people can go to edit their user and upon submission it redirects them to their show profile view.
This all seems to work according to plan but for some reason some when I go back to my edit view I see that some of my form fields get automatically pre-populated while others don't.
Why is this happening?
Specifically the all text fields are being remembered and pre-populated but my image file field and time weekly fields are not. They are definitely still in the database and are displayed in my show view but not pre-populated on the edit view?
Do certain types of fields not get pre-populated or what is this behavior? I would ideally like to have all of the fields pre-populated(image, dates, text, etc)
Here is my code:
Edit view:
<div class="editprofilebox">
<h1>Take a moment to fill out your profile:</h1>
<div class="container-fluid">
<div class="edit-profile-form">
<%= form_for #user, :html => { :role => 'form', :class => 'form-horizontal', :multipart => true } do |f| %>
<div class="form-inputs">
<div class="row">
<div class= "col-sm-4">
<div class: "form-group">
<%= f.text_field :first_name, class: "form-control", placeholder:"First Name" %>
</div>
<div class: "form-group">
<%= f.text_field :last_name, class: "form-control", placeholder:"Last Name" %>
</div>
<div class: "form-group">
<%= f.label :profile_image, class: "control-label" %>
<%= f.file_field :image, class: "profile-picture-upload" %>
</div>
</div>
<div class= "col-sm-4">
<div class: "form-group">
<%= f.label :twitter %>
<%= f.text_field :twitter, class: "form-control", placeholder:"Type your update title here" %>
</div>
<div class: "form-group">
<%= f.text_field :occupation, class: "form-control", placeholder:"Occupation" %>
</div>
<div class: "form-group">
<%= f.text_field :gender, class: "form-control", placeholder:"Gender" %>
</div>
<div class: "form-group">
<%= f.text_field :work_history, class: "form-control", placeholder:"Work History" %>
</div>
<div class: "form-group">
<%= f.number_field :years_of_experience, class: "form-control", placeholder:"years_of_experience" %>
</div>
</div>
<h3> time available </h3>
<div class="col-sm-2">
<%= f.label :Monday %>
<%= f.check_box :monday, class: "time-checkbox", placeholder:"Type your update title here" %>
<%= f.time_field :mondaytime1, class: "form-control time-box"%>
<%= f.time_field :mondaytime2, class: "form-control time-box" %>
<%= f.label :Tuesday %>
<%= f.check_box :tuesday, class: "time-checkbox", placeholder:"Type your update title here" %>
<%= f.time_field :tuesdaytime1, class: "form-control time-box" %>
<%= f.time_field :tuesdaytime2, class: "form-control time-box" %>
<%= f.label :Wednesday %>
<%= f.check_box :wednesday, class: "time-checkbox" %>
<%= f.time_field :wednesdaytime1, class: "form-control time-box" %>
<%= f.time_field :wednesdaytime2, class: "form-control time-box" %>
<%= f.label :Thursday %>
<%= f.check_box :thursday, class: "time-checkbox" %>
<%= f.time_field :thursdaytime1, class: "form-control time-box" %>
<%= f.time_field :thursdaytime2, class: "form-control time-box" %>
</div>
<div class:"col-sm-2">
<%= f.label :Friday %>
<%= f.check_box :friday, class: "time-checkbox" %>
<%= f.time_field :fridaytime1, class: "form-control time-box" %>
<%= f.time_field :fridaytime2, class: "form-control time-box" %>
<%= f.label :Saturday %>
<%= f.check_box :saturday, class: "time-checkbox" %>
<%= f.time_field :saturdaytime1, class: "form-control time-box" %>
<%= f.time_field :saturdaytime2, class: "form-control time-box" %>
<%= f.label :Sunday %>
<%= f.check_box :sunday, class: "time-checkbox" %>
<%= f.time_field :sundaytime1, class: "form-control time-box" %>
<%= f.time_field :sundaytime2, class: "form-control time-box" %>
</div>
</div>
</div>
<div class="form-actions">
<%= f.button :submit, class: "btn btn-default btn-lg" %>
</div>
<% end %>
</div>
</div>
</div>
show view:
<div class="profilebox">
<div class="profile-title-box" >
<%= #user.first_name %> <%= #user.last_name %> profile
</div>
<hr>
<div class="profile-container">
<div class="row ">
<div class="profile-image-box col-sm-4" >
<%= image_tag #user.image.thumb('150x185#').url if #user.image_stored? %>
</div>
<div class="profile-info-box col-sm-8">
<%= #user.email %>
</br>
<%= #user.first_name %>
</br>
<%= #user.last_name %>
</br>
<%= #user.occupation %>
</br>
<%= #user.gender %>
</br>
<%= #user.work_history %>
</br>
<%= #user.years_of_experience %>
</br>
</div>
</div>
</div>
<hr>
<div class="profile-extra-box">
<h3>Complete your profile here:</h3>
<%= link_to 'Edit', edit_user_path(#user) %>
</div>
</div>
users controller:
class UsersController < ApplicationController
def new
end
def show
#user = User.find(params[:id])
end
def index
end
def edit
#user = User.find(params[:id])
end
def update
#user = User.find_by_id(params[:id])
if #user.update_attributes(user_params)
flash[:success] = "User updated successfully!"
redirect_to user_path
else
flash[:danger] = "User could not be updated!"
end
end
def destroy
end
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :image, :twitter, :monday, :mondaytime1, :mondaytime2, :tuesday, :tuesdaytime1, :tuesdaytime2, :wednesday, :wednesdaytime1, :wednesdaytime2, :thursday, :thursdaytime1, :thursdaytime2, :friday, :fridaytime1, :fridaytime2, :saturday, :saturdaytime1, :saturdaytime2, :sunday, :sundaytime1, :sundaytime2, :occupation, :gender, :years_of_experience, :work_history)
end
end
Scheema:
ActiveRecord::Schema.define(version: 20140906225655) do
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "first_name"
t.string "last_name"
t.string "image_uid"
t.string "image_name"
t.text "twitter"
t.boolean "monday"
t.text "mondaytime1"
t.text "mondaytime2"
t.boolean "tuesday"
t.text "tuesdaytime1"
t.text "tuesdaytime2"
t.boolean "wednesday"
t.text "wednesdaytime1"
t.text "wednesdaytime2"
t.boolean "thursday"
t.text "thursdaytime1"
t.text "thursdaytime2"
t.boolean "friday"
t.text "fridaytime1"
t.text "fridaytime2"
t.boolean "saturday"
t.text "saturdaytime1"
t.text "saturdaytime2"
t.boolean "sunday"
t.text "sundaytime1"
t.text "sundaytime2"
t.string "occupation"
t.string "gender"
t.string "work_history"
t.decimal "years_of_experience"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
"Pre-population" has two connotations, both of which you need to consider:
Browser-based data
Server-based data
Browser
The difference here is that browser based data is basically the "remember me" stuff you type into forms on e-commerce sites and the like.
The reason I mention this is because when you have a user form, modern browsers (exclusing IE) will generally populate it with the relevant data you have used before. This can be seen with this introduction to Autofill on Chrome's site:
In essence, it means that if you load standard "input names" on your pages, Chrome will endeavour to populate them with data you've either saved, or inputted into other websites.
Firstly, you need to make sure you are not having your details inputted by the browser. If this the is the case, it will mean you've got to get the server-side functionality working regardless.
Either way, you should look at using the server-based data as described below:
Server
Secondly, you'll have sever-based data. This is real Rails data, and what you need in your page:
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def edit
#user = User.find params[:id]
end
end
#app/views/users/edit.html.erb
<%= form_for #user do |f| %>
<%= f.text_field :first_name %>
<%= f.text_field :last_name %>
<%= image_tag #user.image.url if #user.image.present? %>
<%= f.file_field :image %>
<%= f.submit %>
<% end %>
As per the form_for documentation, if you have the correct ActiveRecord object populated, and have the data in your database, calling the attribute-based input helpers should populate for you.
There are some caveats to this, however:
--
Image
Using file_field will not pre-populate your image.
The file upload element is distinctly different to the image element - simply that the upload element cannot show you an image. This means you have to explicitly show the image in your edit form, if indeed you want to show it:
# Edit View
<%= image_tag #user.image.thumb('150x185#').url if #user.image_stored? %>
<%= f.file_field :image %>
We've used this method here (just sign up for free and try to upload a profile image):
Although we used JQuery heavily here, we made it so that the image form shows the image, which then gives you the ability to upload a new one.
--
Time
Frankly, I'm not sure about your time field.
Like the explanation above, you'll want to ensure you're using the attributes from your database to populate your time fields. I see you're using a lot of different checkboxes, which although might help create a better system, will likely not populate the data you want

How to have two different text outputs w/ ruby on rails 4

Hi I'm using text forms while using pins. My code below:
_form.html.erb
<div class="form-group">
<%= f.label :description %>
<%= f.text_field :description, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :description %>
<%= f.text_field :description, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :image %>
<%= f.file_field :image, class: "form-control" %>
</div>
Index.html.erb
<div class="center">
<h1><strong><%= pin.description %></strong></h1>
<h3><%= pin.description %></h3></div>
<%= link_to image_tag(pin.image.url(:medium)), pin %>
show.html.erb
<div class="panel-heading center">
<%= image_tag #pin.image.url(:medium) %>
</div>
<div class="panel-body">
<h1><strong><%= #pin.description %></strong></h1>
<h3><%= #pin.description %></h3>
I get the same text output when I create a pin and descriptions using that code. I've tried changing the :description method into something else but then I got an error saying I can't load the page. How can I solve this problem? Thank You
ActiveRecord::Schema.define(version: 20131017222026) do
create_table "pins", force: true do |t|
t.string "description"
t.string "definition"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
t.string "image_file_name"
t.string "image_content_type"
t.integer "image_file_size"
t.datetime "image_updated_at"
end
I'm guessing this is your problem (your question really lacks context):
<div class="form-group">
<%= f.label :description %>
<%= f.text_field :description, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :description %>
<%= f.text_field :description, class: "form-control" %>
</div>
If you try and output fields on a form, you'll have to output the fields relating to your model's schema. For example, if you just type f.text_field :my_name, you'll get a no method error
As you've shown your schema, you could put a text field for any of the attributes your record has, such as:
<div class="form-group">
<%= f.label :definition %>
<%= f.text_field :definition, class: "form-control" %>
</div>
No Method Errors
A quick note on no method errors for you
Since Ruby on Rails is Object Orientated, everything you do with it has to involve an object. The best example of this is ActiveRecord objects - they are a variable populated with table data
The reason why you see no method errors is simply because you're trying to perform an action or method on an object which does not support it
So if you have #companies, and try to perform #companies.is_my_name_richard? - it will likely come back with a no method error. The way around this is to ensure you only call the model's attributes (if you're outputting the variable), or only use functions which have been defined in the controller or model

Resources