Saya mengalami kesulitan mencoba menyiapkan beberapa objek formulir khusus di proyek Rails 6 baru yang saya bangun. Saya menduga ini mungkin karena masalah namespace tetapi saya belum bisa memastikannya.

app/views/saasy/signups/new.html.erb

<%= form_with(model: [ :saasy, @signup ], url: saasy_signups_path(@signup),  local: true) do |signup_form| %>

  <%= fields_for :account, @signup.account do |account_fields| %>
    Organization name: <%= account_fields.text_field :organization %>
  <% end %>

  <%= signup_form.submit %>
<% end %>

app/controllers/saasy/signups_controller.rb

class Saasy::SignupsController < ApplicationController
  def new
    @signup = Saasy::SignupForm.new
  end

  def create
    @signup = Saasy::SignupForm.new(signup_form_params)
    @signup.register
  end

  private

  def signup_form_params
    params
      .require(:saasy_signup_form)
      .permit(account_attributes: [:organization])
  end
end

config/routes.rb

Rails.application.routes.draw do
  namespace :saasy do
    resources :signups, only: [:new, :create]
  end
end

app/forms/saasy/signup_form.rb

module Saasy
  class SignupForm
    include ActiveModel::Model

    attr_accessor :user, :account

    delegate :attributes=, to: :user, prefix: true
    delegate :attributes=, to: :account, prefix: true

    def initialize(params= {})
      super(params)
      @user = Saasy::User.new(params)
      @account = Saasy::Account.new(params)
    end

    def register
      # eventually do actual signup stuff here
    end

  end
end

Namun, setiap kali saya mengujinya, saya mendapatkan kembali pesan berikut: param hilang atau nilainya kosong: signup_form

Hash params terlihat seperti ini:

{
"authenticity_token"=>"BhhvRaYKf220afExocQ//LIY1jszVsXs+lThFeUFKvr6ciVBsa+22mSxwO3yT6mK2uOsWSCKx9gL6WIaGmmvSg==", 
"account"=>{"organization"=>"Example Name"}, 
"commit"=>"Create Signup form"
}

Saya sudah mencoba banyak solusi umum seperti bermain dengan form_with dalam tampilan dan mengubah nama rute dll, tetapi sejauh ini saya belum beruntung. Saran apa pun akan sangat dihargai!

1
Awire 31 Januari 2020, 15:31

1 menjawab

Jawaban Terbaik

Ini tidak ada hubungannya dengan ruang nama. Anda hanya membutuhkan kunci param yang salah.

def signup_form_params
  params
    .require(:signup_form)
    .permit(account_attributes: [:organization])
end

Rails mendapatkan "kunci" untuk input dengan memanggil model_name.param_key pada model yang Anda lewati. Kunci param tidak memperhitungkan sarang modul kelas. Seharusnya juga tidak karena itu adalah detail implementasi dan bukan bagian dari "api publik" yang diekspos oleh aplikasi Anda melalui HTTP. Organisasi kode Anda dan parameter route/http aplikasi Anda adalah dua hal yang sangat berbeda.

Anda dapat mengganti kunci dengan memberikan opsi scope: ke form_with.

<%= form_with(model: [ :saasy, @signup ], scope: :saasy_signup_form, local: true) do |signup_form| %>

  <%= fields_for :account, @signup.account do |account_fields| %>
    Organization name: <%= account_fields.text_field :organization %>
  <% end %>

  <%= signup_form.submit %>
<% end %>

Tapi IMHO itu hanya konyol.

0
max 31 Januari 2020, 12:47