[Rails]초학자가 form_with의 흐름을 정리하고 이해하기 위한 기사

소개



Rails 학습 초기에 form_with의 흐름을 이해할 수 없었기 때문에 정리합니다.
Rails5.2.4입니다.

먼저 정리



「빨리 정리해라!」라고 하는 분도 계실까라고 생각하므로, 먼저 흐름을 정리합니다.


간단히 설명



User 모델과 Post 모델이 있는 상황입니다.

①new액션으로 뷰 페이지(new.html.erb)를 표시
new 액션을 호출하라는 요청이 나오면, 먼저 post의 신규 게시(new) 페이지가 표시된다
※이미지


②new액션으로 생성하고 있다 @post 인스턴스를 뷰에 건네준다

post_controller.rb
class PostsController < ApplicationController
~~
  def new
    @post = Post.new #ここで生成されている@postが、new.html.erbに渡される
  end
~~

③ 인스턴스 속성에 값을 입력하여 submit


④create 액션 호출
위의 이미지와 같이 投稿する 버튼 (form_with의 제출)을 클릭하면 form_with가 create 액션을 호출합니다.

※form_with 헬퍼 메소드는 , 건네받은 인스턴스(이 경우는 @post )의 프로퍼티를 보고, create에 날까 update에 날릴지를 판단해 주는 편리한 아이입니다.

form_with가 생각하는 것
- @post が空 → 初めて作るんだな!じゃあcreate!
- @post が空じゃない → 変更したいんだな!じゃあupdate!

⑤post_params 메소드 호출

post_controller.rb
class PostsController < ApplicationController
~~
  def create
    #createアクションが呼び出され、Post.create(post_params)が実行される→ post_paramsが呼び出される
    Post.create(post_params) 
    redirect_to root_path
  end

  private
  def post_params 
    params.require(:post).permit(:title, :content).merge(user_id: current_user.id)
  end
~~

⑥params로 받은 값 중, permit로 받는 값을 지정(허가)

params에서 수신하는 값의 상태
[1] pry(#<PostsController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"oLGgLMTcqSPi7cbK9j1wFhH5rqiwXYO7GyRoZcZFZe6Y5VdbHrWCOyeo37kgW/bsl+eANQrz7p/lAzZMnAS8Gg==", 
"post"=>{"title"=>"今日学んだこと", "content"=>"form_withは賢い子!"}, 
"commit"=>"投稿する", "exept"=>:index, "controller"=>"posts", "action"=>"create"} permitted: false>

보기 어렵기 때문에 본래 없는 위치에서 개행하고 있습니다만, 통상은 1행으로 돌아옵니다.
"post"=>{"title"=>"今日学んだこと", "content"=>"form_withは賢い子!"},post_params 로 취급하는 값입니다.
permit 에서받은 값을 허용하지 않으면 의도하지 않은 값이 테이블에 저장 될 수 있으므로 지정이 거의 필수입니다.

⑦ post_params의 값으로 Post를 create(성공하면 테이블에 저장된다)
post_params 메소드로 반환된 값으로 Post.create 하게 되므로,
실질 아래와 같은 상태입니다.
  def create
    Post.create(title: "今日学んだこと", content: "form_withは賢い子!", user_id: 1) 
    redirect_to root_path
  end

이 흐름을 확인한 후 다시 시작의 이미지를 보면 이해가 깊어진다고 생각합니다!

결론



form_tag, form_for와의 차이점은 이 기사에 요약되어 있습니다.
[Rails]haml에서 form_with/form_for/form_tag를 작성하는 방법

실수 등 있으면 지적해 주시면 다행입니다.

좋은 웹페이지 즐겨찾기