shunta9922
@shunta9922 (shimo shun)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

form_withのデータがdbに保存されない

解決したいこと

Ruby on Railsで映画についてつぶやけるWebアプリをつくっています。
投稿した記事の編集機能を実装した際に、form_withで送信したparams[:content],params[:title]がnilになりdbに保存されません。
form_withのurlを指定すればよいと思い追加したのですが依然問題は解決しません。
ご指摘いただければ幸いです。

該当するソースコード

movies_controller
 def edit
   @movie=Movie.find_by(id: params[:id])
  end

  def update
   @movie = Movie.find_by(id: params[:id])
   @movie.content=params[:content]
   @movie.title=params[:title]

   if @movie.save
     redirect_to movie_path(@movie)
     flash[:notice]="変更しました"

   else
    flash[:notice]="編集に失敗しました"
     render ("movies/edit")
   end
  end

edit.html.erb
<%= form_with(model:@movie,url: {controller: 'movies', action: 'update' },local: true) do |f| %>
            <div class="form" >
                <div class="form-body">
                    <% @movie.errors.full_messages.each do |message| %>
                        <div class="form-error">
                            <%= message %>
                        </div>
                    <% end %>
                    <%= f.text_field :title %>
                    <%= f.text_area :content %>
                    <%= f.submit value="保存" %>
                </div>
            </div>
        <% end %>

routes
resources :movies do
 resources :comments 

  collection do
     get 'search'
   end 
 end
  search_movies GET    /movies/search(.:format)                                                                 movies#search      
                   movies GET    /movies(.:format)                                                                        movies#index       
                          POST   /movies(.:format)                                                                        movies#create      
                new_movie GET    /movies/new(.:format)                                                                    movies#new
               edit_movie GET    /movies/:id/edit(.:format)                                                               movies#edit        
                    movie GET    /movies/:id(.:format)                                                                    movies#show        
                          PATCH  /movies/:id(.:format)                                                                    movies#update      
                          PUT    /movies/:id(.:format)                                                                    movies#update      
                          DELETE /movies/:id(.:format)                                                                    movies#destroy 

schema
  create_table "movies", force: :cascade do |t|
    t.text "content"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "user_id"
    t.string "title"
  end

  50: def update
    51:  @movie = Movie.find_by(id: params[:id])
    52:  @movie.content=params[:content]
    53:  @movie.title=params[:title]
 => 54: binding.pry
    55:  if @movie.save
    56:    redirect_to movie_path(@movie)

<page break> --- Press enter to continue ( q<enter> to break ) --- <page break>
    57:    flash[:notice]="変更しました"
    58:
    59:  else
    60:   flash[:notice]="編集に失敗しました"
    61:    render ("movies/edit")
    62:  end
    63: end
[1] pry(#<MoviesController>)> params[:content]
=> nil
[2] pry(#<MoviesController>)> params[:title]
=> nil
0

2Answer

恐らくparams[:movie][:content], params[:movie][:title] ではないでしょうか?
まずparamsを表示してみて、想定する値を持っているのか確認するのが先決かと思います。

またこのコードではupdate時に属性を一つずつ受け取っているので問題はないのですが、Strong Parameters の利用も検討したいですね。

1Like

Comments

  1. @kiyokuro 様の回答の通りです。「理由」は「そういう仕様だから」となります。
    「form_withが実際にはどういうHTMLを生成しているか」「そのHTMLからのPOSTデータをparamsはどう受け取るのか」の2つを確認したいですね。
    前者は@kiyokuro様の提示したURLに、後者については以下のページに述べられています。
    https://railsguides.jp/action_controller_overview.html#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%81%A8%E9%85%8D%E5%88%97%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF
  2. @shunta9922

    Questioner

    なるほどありがとうございます。form_with,postについて理会が不十分でした。解説ありがとうございます

Comments

  1. @shunta9922

    Questioner

    回答ありがとうございます。form_withとhtml間について理解不足でした。ありがとうございます。

Your answer might help someone💌