LoginSignup
0
0

POSTメソッドがGETメソッドになるエラーの解消法

Posted at

Railsのアプリケーションにおいて、HTTPメソッドが期待どおりに動作しないという問題に直面しました。ここでは、問題の原因とその解決策について説明します。

問題の概要

  • お気に入りに追加するためのボタンがクリックされても、お気に入り登録されませんでした。
  • ボタンはbutton_toヘルパーを使用しており、POSTリクエストを送信することが期待されていました。

原因

原因は、button_toform_withの内部に配置されていたため、ネストされたフォームが作成されていました。これは、HTMLのフォームの中に別のフォームをネストすることはできないというルールに反しています。結果として、button_toによるPOSTリクエストが発生しなくなっていました。

解決策

解決策として、button_tolink_toに置き換え、data-turbo-method属性を使用してPOSTリクエストを送信するように変更しました。

変更前.erb
<%= button_to 'お気に入りに追加', favorite_companies_path(company_id: viewing_company.id), data: { turbo_method: :post }, class: 'btn btn-info'  %>
変更後.erb
<%= link_to 'お気に入りに追加', favorite_companies_path(company_id: viewing_company.id), data: { turbo_method: :post }, class: 'btn btn-info'  %>

変更後のコード

以下のコードは、変更を加えた部分を示しています。link_toヘルパーを使用し、適切にPOSTリクエストが送信されるようにしました。

<% if current_customer %>
  <% if current_customer.companies.include?(viewing_company) %>
    <!-- お気に入り解除のボタン -->
  <% else %>
    <div class="form-group d-flex align-items-center me-2">
      <%= link_to 'お気に入りに追加', favorite_companies_path(company_id: viewing_company.id), data: { turbo_method: :post }, class: 'btn btn-info' %>
    </div>
  <% end %>
<% end %>

data-turbo-method属性を使って、Turbo DriveがAjaxリクエストとしてこのリンクを扱うように指定しました。これにより、ユーザーが「お気に入りに追加」ボタンをクリックすると、背後でPOSTリクエストが送信され、お気に入りとして登録されます。

結果

この変更により、お気に入り機能は期待通りに動作し、ユーザーが企業をお気に入りに追加できるようになりました。


この記事がお気に入り機能の実装で遭遇する可能性のある問題とその解決策について理解を深めるのに役立つことを願っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0