Rails 5.2 Devise Редактировать через частичную отправку через Put, а не Post - PullRequest
0 голосов
/ 19 апреля 2020

Я использую частичное для редактирования только одного столбца моей таблицы Devise User, и когда я нажимаю кнопку отправки, по умолчанию используется put вместо post.

Вид выглядит следующим образом:

<h4 class="color-white font-weight-bold responsive-heading">
 Add your code to your profile now!
</h4>
<% if current_user %>
  <%= render partial: "devise/registrations/update_swing_code" %>
<% else %>
  <%= link_to "Create My Free Account", new_user_registration_path, class: "btn btn-yellow" %>
<% end %>

С этим частичным:

<% @user = current_user %>

<%= simple_form_for(@user, as: User, :url => update_swing_code_path, :html => { :method => :put }) do |f| %>
  <%= hidden_field_tag(:string_code, id: "hiddenStringCode") %>

  <section class="form-inputs">
    <div class="form-group text-center">
      <input id="field01" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field02" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field03" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      -
      <input id="field04" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field05" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field06" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      -
      <input id="field07" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field08" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field09" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
      <input id="field10" type="text" class="form-control display-3 font-typewriter inline-block code-digit inputs" maxlength="1" style="width: 50px; height: 70px; font-size: 2rem" >
    </div>
 </section>

 <div class="text-center">
   <%= f.error_notification %>
 </div>

  <div id="submitButton" class="form-actions mt-3">
    <%= f.button :submit, "Update My Swing Code", class: "btn btn-yellow", controller: "registrations", method: :post %>
  </div>

<% end %>



<script>
  $(document).ready(function() {
    $(".code-digit").keyup(function () {
        if (this.value.length == this.maxLength) {
          $(this).next('.inputs').focus();
        }
        var swing_code = "";
        swing_code = $("#field01").val() + $("#field02").val() + $("#field03").val() + "-" + $("#field04").val() + $("#field05").val() + $("#field06").val() + "-" + $("#field07").val() + $("#field08").val() + $("#field09").val() + $("#field10").val()
        $("#string_code").val( swing_code );
    });
  });
</script>

My registrations_controller имеет этот метод:

def update_swing_code @user = User.find (current_user.id) @ user.swing_code = params [: swing_code] @ user.save redirect_to user_path (@user) flash [: note] = "Ваш код свинга был сохранен!" end

И у моего routes есть это:

  devise_for :users, :controllers => { registrations: 'registrations' }
  resources :users, only: [:show, :index]
  get 'users/show'
  get 'users/index'
  devise_scope :user do
   post "/users/:id/update_swing_code" => "registrations#update_swing_code", as: "update_swing_code"
  end

Тем не менее, когда я нажимаю кнопку отправки (несмотря на явное указание, что она использует method: :post, я по-прежнему получаю красный и белый цвета экран смерти, говорящий:

Не найдено ни одного маршрута [PUT] "/ users / fullswing / update_swing_code"

Может кто-нибудь помочь мне разобраться, как заставить этого парня отправлять ? Для такой простой задачи отладка занимает слишком много времени!

1 Ответ

1 голос
/ 19 апреля 2020

Используется PUT вместо POST, потому что при вашем simple_form_for вызове вы используете html => { :method => :put }. Если вы хотите использовать POST, вы должны изменить simple_form_for на html => { :method => :post } и удалить method: :post из вашего f.button вызова. Имейте в виду, однако, что соглашение Rails должно использовать PATCH для обновления, а не POST. Однако вам не нужно добавлять метод HTTP. Rails выведет метод из переменной экземпляра. Если это новая запись, Rails будет использовать метод POST HTTP, а если это не новая запись, Rails будет использовать метод PATCH HTTP.

Читать о Маршрутизация ресурсов

...