ã¯ããã«
Fat Controllerãé¿ããããã«ãããžãã¹ããžãã¯ãã¢ãã«ã«å®çŸ©ãããšããã¢ãããŒããããèŠãããŸãããããããã®æ¹æ³ãç²ç®çã«é©çšãããšãä»åºŠã¯Fat Modelãšããå¥ã®åé¡ãçºçããå¯èœæ§ããããŸãã
Fat Modelã«ãªããšãã¢ãã«ã®ã³ãŒããè¥å€§åããå¯èªæ§ãä¿å®æ§ãäœäžããŸãããŸããç¹å®ã®ããžãã¹ããžãã¯ã«é¢é£ããåŠçããä»ã®ããžãã¹ããžãã¯ã®å®è£ æã«èæ ®ããªããã°ãªããªããªããªã©ãã¢ãã«ã®é¢å¿äºãåºãããããŠããŸãåé¡ããããŸãã
ãããã®åé¡ãåé¿ããããã«ãFormãªããžã§ã¯ããšãããã¶ã€ã³ãã¿ãŒã³ãååšããŸããFormãªããžã§ã¯ãã¯ããã©ãŒã ã«é¢é£ããããžãã¹ããžãã¯ãç¬ç«ããã¯ã©ã¹ãšããŠå®çŸ©ããããšã§ãã¢ãã«ãã³ã³ãããŒã©ãŒããããžãã¯ãåé¢ããŸãã
Formãªããžã§ã¯ãã¯ã©ãããå Žé¢ã§æçšãïŒ
Formãªããžã§ã¯ãã¯ä»¥äžã®å Žåã«æçšã§ãã
-
ãã©ãŒã åºæã®ã³ãŒã«ããã¯/ããªããŒã·ã§ã³ãããå Žå
-
ã¢ãã«ã®åã«ã©ã ãšãã©ãŒã ã®inputã1:1ãšãªããªãå Žå
ãããã解説èŽããŸãã
ãã©ãŒã åºæã®ã³ãŒã«ããã¯/ããªããŒã·ã§ã³ãããå Žå
ãã©ãŒã ã«åºæã®ã³ãŒã«ããã¯ãããªããŒã·ã§ã³ãããå Žåãããããã¢ãã«ã«çŽæ¥èšè¿°ããŠããŸããšãä»ã®ããžãã¹ããžãã¯ã§ãã®ã¢ãã«ã䜿çšããéã«ãæå³ããªãã³ãŒã«ããã¯ãå®è¡ãããŠããŸãå¯èœæ§ããããŸãã
ãã¡ããã以äžã®ãããªã³ãŒãã䜿ã£ãŠãæ¡ä»¶ã«å¿ããŠã³ãŒã«ããã¯ã®å®è¡ãå¶åŸ¡ããããšãã§ããŸãïŒ
after_update :send_email, if: -> { is_context_form? }
ãããããã®ãããªã¢ãããŒããåããšãåæ§ã®ããžãã¹ããžãã¯åºæã®æ¡ä»¶åå²ãã³ãŒã«ããã¯ãããªããŒã·ã§ã³ã«å€§éã«ååšããå Žåãã³ãŒãã®å¯èªæ§ãäœäžãããã°ãçã¿åºãåå ãšãªã£ãŠããŸããŸãã
ãã®åé¡ã解決ããããã«ãFormãªããžã§ã¯ãã䜿çšããããšã广çã§ãã
Formãªããžã§ã¯ãã䜿ãã°ããã©ãŒã åºæã®åŠçãFormãªããžã§ã¯ãå ã§å®çµãããããšãã§ããŸãããã®çµæãã¢ãã«ã«ã¯ã¢ãã«å šäœã§å ±éçã«å¿ èŠãªå®çŸ©ã®ã¿ãæ®ããã³ãŒãããã£ãããšããŸãã
ãŸãããã©ãŒã ã«é¢é£ããåŠçã¯Formãªããžã§ã¯ãã«éçŽããããããã³ãŒãã®èŠéããè¯ããªããéçºå¹çãåäžããŸãã
ã¢ãã«ã®åã«ã©ã ãšãã©ãŒã ã®inputã1:1ãšãªããªãå Žå
äŸãã°ãäœæãå ¥åãããã©ãŒã ã§ãéœéåºçãšåžåºçºæãå¥ã ã®å ¥åé ç®ã§å ¥åããŠãããããããããŒã¿ãç»é²ããéã«ã¯ãããããé£çµããŠäžã€ã®ã«ã©ã ã«ä¿åããããšããã±ãŒã¹ãèããŠã¿ãŸããããïŒããã§ã¯ãããããå¥ã®ã«ã©ã ã«ãã¹ããæååã§ã¯ãªãå€éšããŒã«ãã¹ããšããè°è«ã¯çœ®ããŠãããŸããïŒ
ãã®å ŽåãFormãªããžã§ã¯ãã䜿çšããªãæ¹æ³ãšããŠã以äžã®2ã€ã®ã¢ãããŒããèããããŸãã
-
Cookieã«ããŒã¿ãä¿æããã³ã³ãããŒã©ãŒã§éä¿¡ãããå€ãé£çµããããããªããŒã·ã§ã³ãšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºããžãã¯ãèšè¿°ããã
-
ã¢ãã«ã«éœéåºçãšåžåºçºæã®
attributeãå®çŸ©ããbefore_validationã§é£çµããŠã«ã©ã ã«å€ãã»ããããã
ãããã1ã€ç®ã®æ¹æ³ã§ã¯ãæ¬æ¥ã³ã³ãããŒã©ãŒã§å®è£
ãã¹ãã§ã¯ãªãåŠçãå«ãŸããŠããŸããŸãããããåé¿ããããã«ã¯ããµãŒãã¹ãªããžã§ã¯ããªã©ãå¥éå®è£
ããå¿
èŠããããŸãããform_withãšã®èŠªåæ§ãèæ
®ãããšãFormãªããžã§ã¯ãã®æ¹ãããé©ããŠããŸãã
2ã€ç®ã®æ¹æ³ã§ã¯ããã©ãŒã åºæã®å±æ§ãã¢ãã«ã«æ¬¡ã ãšå®çŸ©ãããŠãããšãã¢ãã«ãè¥å€§åããŠããŸãåé¡ããããŸãããŸãããããã®å±æ§ã¯ããŒã¿ããŒã¹ã«ã¯ä¿åãããªããããã¢ãã«ã®è²¬åããéžè±ããŠããŸããŸãã
Formãªããžã§ã¯ãã䜿çšãããšãFormãªããžã§ã¯ãå
ã«éœéåºçãšåžåºçºæã®attributeã®å®çŸ©ããæååé£çµãªã©ã®ããžãã¹ããžãã¯ããŸãšããããšãåºæ¥ãŸãã
Formãªããžã§ã¯ãã®å®çŸ©æ¹æ³
ãããŸã§ã®å 容ããFormãªããžã§ã¯ãå°å ¥ã«ããã¡ãªãããçè§£é ããããšæããŸãã
ã§ã¯ãFormãªããžã§ã¯ãã¯ã©ã®ããã«å®çŸ©ãã¹ãã§ããã以äžã®ã³ãŒãã確èªé ããã°ãšæããŸãã
app/models/post/post_form.rb
class Post::PostForm
include ActiveModel::Model
include ActiveModel::Attributes
attribute :prefecture, :string
attribute :municipality, :string
validates :address, presence: true # formã§ã®ã¿ããªããŒã·ã§ã³ããåæ
delegate_missing_to :post
def initialize(attributes = {}, post: Post.new)
@post = post
super(attributes)
end
def save
set_address
return if invalid?
ActiveRecord::Base.transaction do
post.save!
end
rescue ActiveRecord::RecordInvalid
false
end
# ãã¥ãŒã®è¡šç€ºïŒform_withïŒã«å¿
èŠãªã¡ãœãã
# ã¢ã¯ã·ã§ã³ã®URLãé©åãªãã®ïŒposts_pathãpost_path(id)ïŒã«åãæ¿ããŠããã
def to_model
post
end
private
attr_reader :post
def set_address
post.address = "#{prefecture} #{municipality}"
end
end
Formãªããžã§ã¯ãã®äœ¿ç𿹿³
䜿çšããéã«ã¯ä»¥äžã®ããã«äœ¿çšããŸãã
app/controllers/posts_controller.rb
class PostsController < ApplicationController
before_action :set_post, only: %i[edit update]
def new
@post = Post::PostForm.new
end
def create
@post = Post::PostForm.new(post_params)
if @post.save
redirect_to posts_path, notice: 'Successfully created!'
else
render :new
end
end
def edit
@post = Post::PostForm.new(post: @post)
end
def update
@post = Post::PostForm.new(post_params, post: @post)
if @post.save
redirect_to @post, notice: 'Successfully updated!'
else
render :edit
end
end
private
def post_params
params.require(:post).permit(:title, :content, :prefecture, :municipality)
end
def set_post
@post = Post.find(params[:id])
end
end
viewã®forméšå
<%= form_with model: @post do |f| %>
<%= f.text_field :title %>
<%= f.text_area :content %>
<%= f.text_field :prefecture %>
<%= f.text_field :municipality %>
<%= f.submit %>
<% end %>
ãã®ããã«ããŠã³ã³ãããŒã©ã§newããŠviewã§ã¯Formãªããžã§ã¯ãã䜿çšããªããã¿ãŒã³ãšåæ§ã«æ±ãäºãå¯èœãšãªãããã¥ãŒãšFormãªããžã§ã¯ãã®çµå床ãäžããããæè»ã§ä¿å®æ§ã®é«ãã³ãŒããæžãããšãå¯èœã«ãªããŸãã
å°ãã¿ã§ãããå人çã«Formãªããžã§ã¯ãã䜿çšããæã¯delegate_missing_toã䜿çšããããšãå€ãã§ãã
Formãªããžã§ã¯ãã«ååšããªãã¡ãœãããåŒã³åºãããå Žåã«ãæå®ãããªããžã§ã¯ãã«ãã®åŠçãå§è²ããããã®æ©èœã§ãã
äŸãã°ã@post.persisted?ã®ããã«ãPost::PostFormã«å®çŸ©ãããŠããªãã¡ãœãããcallãããå Žåãpostãªããžã§ã¯ãã®persisted?ã¡ãœããã代ããã«åŒã³åºãããŸãã
delegate_missing_toãæŽ»çšããããšã§ãFormãªããžã§ã¯ããšã¢ãã«ãªããžã§ã¯ãã®éã®åŠçã®å§è²ãç°¡æœã«è¡šçŸã§ããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžããŸãã
æåŸã«
Formãªããžã§ã¯ãã¯ãRailséçºã«ãããŠéåžžã«æçšãªãã¿ãŒã³ã§ãããé©åã«äœ¿çšããããšã§ã³ãŒãã®å質ãšéçºå¹çãåäžãããããšãã§ããŸãããããžã§ã¯ãã®èŠä»¶ãèŠæš¡ã«å¿ããŠãFormãªããžã§ã¯ãã®å°å ¥ãæ€èšããŠã¿ãŠãè¯ããããããŸããã