開始タグ
ユーザー登録実装中に、データベースに登録できなくて詰まったのでメモ。
道中
色々な参考サイトを探してみるも明確な答えにたどり着けず、とりあえず「ry-byebug」のgemでデバッグして見た。
def create
@user = User.new(name: params[:name], pass: params[:pass])
@user.save
binding.pry
redirect_to("/dashboard/index")
end
すると以下のエラーが。
Started POST "/users/create" for 172.21.0.1 at 2019-10-20 13:31:02 +0000
Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"AGAzaEa5VNEyv9sRn/kzQORFEDBs8CsBuxAPeH+7xB8ZM/qOfevgOKQLlmJH4mAHaDb6XEWhPWh2zHFPsMuVhA==", "name"=>"usertest", "pass"=>"passtest"}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms)
ActiveModel::UnknownAttributeError (unknown attribute 'username' for User.):
app/controllers/users_controller.rb:9:in `create'
username
なんてないはずなのだが・・・と思い調べてみると、同じような現象が起きている方の投稿を発見。
ActiveModel::UnknownAttributeErrorの意味|teratail
もう一度db:migrateを行えば解決したようですので、試してみる。
※Dockerを使用しています。
docker-compose run web bundle exec rake db:migrate
再度登録作業を行ったら、無事データベースに登録されました。
試しにフォームのinputのname属性を変更して再度登録してみました。
user→username
pass→password
<%= form_tag("/users/create") do %>
<input type="text" name="username" placeholder="ユーザーネーム" class="form_inp inp_text">
<input type="text" name="password" placeholder="パスワード" class="form_inp inp_text">
<div class="btn_area">
<input type="submit" value="登録する" class="btn btn01 darkblue">
<!-- /btn_area -->
</div>
<% end %>
すると再度エラーが出ました。
そこでもう一度db:migrateすると、無事登録できるようになりました。
なるほど、そういえばname属性をusername
に変更していたな・・・。
一度送信を行ったあと(失敗しても)にinputのname属性を変更してしまうとエラーになってしまうようで、「name属性を変更してしまったこと」が原因だった。
閉じタグ
今後、name属性の変更はなるべく行わないようにしよう。
データベースへの登録に困った際は「db:migrate」を試してみよう。
時間かかってしもうた・・・。