More Rails!
Validations, Associations, Params, Heroku, and more!
Today:
- Models:
- Validations
- Associations
- Controller:
- Strong parameters
- Views
- Partials
- Heroku
YOU ARE HERE
Model
Validations
Validations
validates :attribute, { validators }
OR
validates_validator_of [ :attributes ]
Associations
-
has_many
- A Student has many Grades
-
belongs_to
- Grades belong to Students
-
has_one
- A Teacher has one Class
Associations
class Student < ActiveRecord::Base
has_many :grades
end
class Grade < ActiveRecord::Base
belongs_to :student
end
name | age | major | id |
---|---|---|---|
Bob | 20 | EECS | 1 |
Alice | 19 | Bio | 2 |
id | grade | student_id |
---|---|---|
100 | 4 | 1 |
101 | 3 | 1 |
Primary Key
Foreign Key
name | age | major | id |
---|---|---|---|
Bob | 20 | EECS | 1 |
Alice | 19 | Bio | 2 |
id | grade | student_id |
---|---|---|
100 | 4 | 1 |
101 | 3 | 1 |
Primary Key
Foreign Key
Associations
student = Student.find(1)
student.grades
Controller
Params
- Dictionary that contains information about the request made. (Controller, action, url, etc.)
def show
@user = User.find params[:id]
end
- Also contains form parameters, url parameters, ids, etc.
Params
class PostsController < ApplicationController
def index
@post = Post.new
@posts = Post.all
end
def create
puts params
@post = Post.new post_params
@post.save
redirect_to root_path
end
def like
end
private
def post_params
params.require(:post).permit(:text)
end
endclass PostsController < ApplicationController
def index
@post = Post.new
@posts = Post.all
end
def create
puts params
@post = Post.new post_params
@post.save
redirect_to root_path
end
def like
end
private
def post_params
params.require(:post).permit(:text)
end
end
Params
Problem:
User
- name
- age
- major
- admin
Strong parameters
Problem:
User
- name
- age
- major
- admin
Strong parameters
BUT
curl -d "user[name]=Charles"
-d "user[major]=EECS"
-d "user[age]=20"
-d "user[admin]=true"
http://localhost:3000/users
Strong Params
- Define whitelisted attributes that you can create a model with.
def user_params
params.require(:user).permit(:name, :age, :major)
end
curl -d "user[name]=Charles"
-d "user[major]=EECS"
-d "user[age]=20"
-d "user[admin]=true"
http://localhost:3000/users
Strong Params
def create
@user = User.new params[:user]
end
def create
@user = User.new user_params
end
private
def user_params
params.require(:user).permit(:name, :age, :major)
end
BECOMES
View
Partials
BEFORE
<div class="html-file-1">
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Clients</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</div>
<div class="html-file-2">
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Clients</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</div>
<div class="html-file-4">
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Clients</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</div>
<div class="html-file-3">
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Clients</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
</div>
app/views/users/file1.html
app/views/users/file2.html
app/views/users/file3.html
app/views/users/file4.html
Partials
After
<div class="html-file-3">
<%= render "shared/partial" %>
</div>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Clients</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
<div class="html-file-1">
<%= render "shared/partial" %>
</div>
<div class="html-file-2">
<%= render "shared/partial" %>
</div>
<div class="html-file-4">
<%= render "shared/partial" %>
</div>
app/views/shared/_partial.html.erb
app/views/users/file1.html.erb
app/views/users/file2.html
app/views/users/file3.html
app/views/users/file4.html
Partials
<%= hello %>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Clients</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
</nav>
app/views/shared/partial.html.erb
<div class="html-file-4">
<%= render "shared/partial", hello: "Hello" %>
</div>
app/views/users/file4.html
Discussion 5 - More Rails
By Charles Xue
Discussion 5 - More Rails
- 1,129