Пространственные объекты формы в Rails - PullRequest
1 голос
/ 31 января 2020

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

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 / rout.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

Однако всякий раз, когда я проверяю его, я получаю следующее сообщение: параметр отсутствует или значение пусто: signup_form

Параметры ha sh выглядят так:

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

Я пробовал множество общих решений, таких как игра с form_with в представлении и изменение названия маршрута и т. д. c, но пока мне не повезло. Любой совет будет очень признателен!

1 Ответ

0 голосов
/ 31 января 2020

Это не имеет ничего общего с пространствами имен. Вам просто требуется неверный ключ параметра.

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

Rails получает «ключ» для входов, вызывая model_name.param_key в модели, которую вы передаете. Ключ param не учитывает вложенность модуля в класс. В действительности это также не является деталью реализации, а не частью «publi c api», которое ваше приложение предоставляет через HTTP. Ваша организация кода и параметры маршрутов / http вашего приложения - две совершенно разные вещи.

Вы можете переопределить ключ, указав параметр scope: для 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 %>

Но ИМХО это просто глупо.

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