railsのおさらいです。私の環境では、railsは4.1.1でした。
controllerのaction定義の仕方
def new
@project = Project.new
end
またbefore_actionを指定することで、showやindexアクションの前に特定のアクションをフックできます。
before_action :set_article
def show
end
def edit
end
def set_article
@article = Article.find(params[:id])
end
privateキーワードを使う
rubyのprivateキーワードはJavaなどとは違い、親で指定したprivateなメソッドに子供クラスからアクセスできます。
private
def undo_link
if can? :revert, :versions
version = @comment.versions.scoped.last
view_context.link_to("undo", revert_version_path(version), :method => :post) if can? :revert, version
end
end
Rails4のrequire,permit
rails4ではストロングパラメータというメソッドが追加されました。(require, permit)
def user_params
params.require(:user).permit(:name, :email)
end
requireを指定することで特定のキーを条件にフィルタをかけられます。またpermitを使えば取得したいレコードだけ取得できます。
viewのフォームの書き方の一例
<%= form_for @project do |f| %>
<p>
<%= f.label :title %><br>
<%= f.text_field :title %>
<% if @project.errors.any? %>
<%= @project.errors.messages[:title][0] %>
<% end %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
※ @で始まる変数をインスタンス変数という。インスタンス変数は頭文字は小文字という規則がある。
- <%= @project.errors.messages[:title][0] %>で使われるエラーメッセージはmodelに書くことになる。
- <%= form_for @project do |f| %> のfは別にどんな名前でもいい。ここで使われている@projectはcontrollerのアクションで生成した変数、例えば、@project = Project.find(params[:id]) を参照している。
modelクラスの記述
class Project < ActiveRecord::Base
has_many :projects
validates :title,
presence: { message: "入力してください" },
length: { minimum: 3, message: "3文字以上必要"}
def self.search(search) #self.でクラスメソッドとしている
if search # Controllerから渡されたパラメータが!= nilの場合は、titleカラムを部分一致検索
Project.where(['name LIKE ?', "%#{search}%"])
else
Project.all #全て表示。
end
end
end
上記のようにアソシエーションの指定やバリデーションルールを定義する。ActiveRecordのBaseクラスを継承しているのでORMが使える。