ActionController :: ParameterMissing (параметр отсутствует или значение пустое: JSON simple_form_for - PullRequest
0 голосов
/ 01 апреля 2019

Я провел полтора дня, просматривая все подобные вопросы, но ни один из них не решил мою текущую проблему.

У меня есть простая форма, которая отображает форму javascript, и я получаю: ActionController :: ParameterMissing (параметр отсутствует или значение пусто: ссылка): всякий раз, когда я пытаюсьотправить форму.Я попытался использовать fetch вместо require в моих параметрах, но это не исправляет (не регистрирует ошибку, но и ничего не сохраняет).

Я перепробовал все, что мог придумать, и сейчас растерялся.Я использовал унаследованный пример кода для настройки формы, так что по сути это тот же формат, что и формы, которая работает, поэтому я действительно не знаю, чего мне не хватает.

Я отображаю форму вчастично, поэтому в моих взглядах у меня есть:

просмотров / домовладельцев / приборной панели / show.html.erb

<%= render "homeowners/dashboard/referrals" %>

<div class="refer-resident-form hidden">
  <%= render 'referral_form' %>
</div>

просмотров / домовладельцев / приборной панели/referrals.html.erb

<div class="card article branded-border">
  <div class="refer-overlay">
    <div class="card-content refer-summary">
      <p class="larger"><%= t(".refer_developer") %></p>
      <p><%= t(".refer_description") %></p>
      <div class="refer-button">
      <%= button_tag t(".refer"), class: "btn branded-btn refer-resident",
      data: { cancel: t("edit.cancel"),
            cta: t(".send_invitation"),
            title: t(".refer")} %>
      </div>
    </div>
  </div>
</div>

просмотров / домовладельцев / приборной панели / _referral_form.html.erb

<div class="refer-description">
  <h4><%= t(".refer_description") %> </h4>
</div>

<%= simple_form_for @referral, url: homeowner_dashboard_path, remote: true do |f| %>
  <%= f.input :referee_first_name, label: t(".first_name"), required: true %>
  <%= f.input :referee_last_name, label: t(".last_name"), required: true %>
  <%= f.input :referee_email, label: t(".email"), required: true %>

  <%= f.hidden_field :referrer_name, value: (current_resident.first_name + " " + current_resident.last_name) %>
  <%= f.hidden_field :referrer_email, value: current_resident.email %>
  <%= f.hidden_field :referral_date, value: Time.now %>
<% end %>

Мой контроллер контроллеры/homeowners/referrals_controller.rb

module Homeowners
  class ReferralsController < Homeowners::BaseController

    def create
      create_new_referral
    end

    private

    def create_new_referral
      @referral = Referral.new(referral_params)
      redirect_to root_path
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def referral_params
      params.require(:referral).permit(
        :referee_first_name, :referee_last_name, :referee_email, :referral_date,
        :referrer_name, :referrer_email
      )
    end
  end
end

И мой файл javascript refer.js (пожалуйста, помните, что я ничего не знаю о javascript и по сути скопировал этот код из другой формы, просто внося незначительные изменения, чтобы сделать это актуальным)

(function (document, $) {
  'use strict'

  $(document).on('click', '.refer-resident', function (event) {
    var dataIn = $(this).data()

    var $referContainer = $('.refer-resident-form')

    $('body').append($referContainer)
    var $form = $('.refer_resident')

    $referContainer.dialog({
      show: 'show',
      modal: true,
      width: 700,
      title: dataIn.title,
      buttons: [
        {
          text: dataIn.cancel,
          class: 'btn',
          click: function () {
            $(this).dialog('destroy')
          }
        },
        {
          text: dataIn.cta,
          class: 'btn-send btn',
          id: 'btn_submit',
          click: function () {
            // Clear any old messages before the post
            $('.flash').empty()

            $.post({
              url: '/homeowners/referral',
              data: $form.serialize(),
              dataType: 'json',
              success: function (response) {
                var $responseP = document.createElement('p')
                if (response.alert === null) {
                  $responseP.className = 'notice'
                  $responseP.innerHTML = response.notice
                } else {
                  // If there are both alert and notice responses, only show the alert
                  $responseP.className = 'alert'
                  $responseP.innerHTML = response.alert
                }
                $('.flash').append($responseP)
                $(window).scrollTop(0)
              }
            })
            $(this).dialog('destroy')
            $referContainer.hide()
          }
        }]
    }).prev().find('.ui-dialog-titlebar-close').hide() // Hide the standard close button

    validateSendReferral()
  })

  $(document).on('input', '.refer-resident-form', function (event) {
    validateSendReferral()
  })

  function validateSendReferral () {
    if (($('input#referral_referee_first_name').val().length > 0)
        && ($('input#referral_referee_last_name').val().length > 0) && validateEmail()) {
      $('.btn-send').prop('disabled', false)
      $('.btn-send').removeClass('ui-state-disabled')
    } else {
      $('.btn-send').prop('disabled', true)
      $('.btn-send').addClass('ui-state-disabled')
    }
  }

  function validateEmail () {
    var re = /\S+@\S+\.\S+/
    return re.test($('input.email').val())
  }

})(document, window.jQuery)

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

Редактировать:

Когда я отправляю форму, я получаю следующий вывод

   (0.2ms)  BEGIN
   (0.2ms)  COMMIT
Started POST "/homeowners/referral" for ::1 at 2019-04-01 12:40:41 +0100
Processing by Homeowners::ReferralsController#create as JSON
  Resident Load (0.6ms)  SELECT  "residents".* FROM "residents" WHERE "residents"."id" = $1 ORDER BY "residents"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
   (0.7ms)  SELECT COUNT(*) FROM "resident_notifications" WHERE "resident_notifications"."resident_id" = $1 AND "resident_notifications"."read_at" IS NULL  [["resident_id", 2]]
  Plot Load (0.5ms)  SELECT  "plots".* FROM "plots" WHERE "plots"."deleted_at" IS NULL AND "plots"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Developer Load (0.5ms)  SELECT  "developers".* FROM "developers" WHERE "developers"."deleted_at" IS NULL AND "developers"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Country Load (0.3ms)  SELECT  "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Development Load (0.3ms)  SELECT  "developments".* FROM "developments" WHERE "developments"."deleted_at" IS NULL AND "developments"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  Brand Load (0.3ms)  SELECT  "brands".* FROM "brands" WHERE "brands"."brandable_id" = $1 AND "brands"."brandable_type" = $2 LIMIT $3  [["brandable_id", 1], ["brandable_type", "Development"], ["LIMIT", 1]]
Completed 400 Bad Request in 24ms (ActiveRecord: 3.1ms)



ActionController::ParameterMissing (param is missing or the value is empty: referral):

app/controllers/homeowners/referrals_controller.rb:23:in `referral_params'
app/controllers/homeowners/referrals_controller.rb:17:in `create_new_referral'
app/controllers/homeowners/referrals_controller.rb:11:in `create'

1 Ответ

0 голосов
/ 01 апреля 2019

Похоже, что вы пытаетесь сериализовать форму с помощью селектора jQuery, который на самом деле может не нацеливаться на форму. В частности, вы звоните

var $form = $('.refer_resident')

, а затем

$.post({
  ...
  data: $form.serialize(),

но я не вижу, что вы даете форму этому классу специально, и я не думаю, что simple_form сгенерирует этот класс для вас. Я считаю, что он будет генерировать классы, такие как .new_referral и .edit_referral на основе наличия атрибута id. Вы можете явно назначить этот класс или просто использовать встроенный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...