Я делаю форму для регистрации, и у меня есть класс с именем ManagedCompany, у которого есть атрибут, названный компанией класса Company. У компании класса есть атрибут из другого класса с именем Address. Итак, в этих классах есть композиции.Ruby on rails and composition in OOP: Как я могу получить доступ к атрибутам в simple_form?
Классы представлены ниже:
приложение/модели/managed_company.rb
class ManagedCompany
include ActiveModel::Model
def initialize
@company = Company.new
end
attr_accessor :name, :string
attr_accessor :company, :Company
end
приложение/модели/company.rb
class Company
include ActiveModel::Model
def initialize
@address = Address.new
end
attr_accessor :category, :string
attr_accessor :name, :string
attr_accessor :address, :Address
validates_presence_of :category
validates_presence_of :name
end
приложение/модели /address.rb
class Address
include ActiveModel::Model
attr_accessor :street, :string
attr_accessor :number, :string
validates_presence_of :street
validates_presence_of :number
end
Моя форма:
<%= simple_form_for @managed_company do |form| %>
<%= form.input :company.address.street, autofocus: true %>
<% end %>
Но этот способ не работает. Сообщение об ошибке:
undefined method `address' for :company:Symbol
Таким образом, в форме (simple_form рубина на рельсах), как я могу получить доступ к улице атрибута из объекта адреса?
Edit: добавить контроллеры код
приложение/контроллеры/managed_companies_controller.rb
class ManagedCompaniesController < ApplicationController
def new
@managed_companies = ManagedCompanies.new
end
def create
@managed_companies = ManagedCompanies.new(secure_params)
if @managed_companies.valid?
else
render :new
end
end
private
def secure_params
params.require(:managed_companies).permit(:name)
end
end
приложение/контроллеры/companies_controller.rb
class CompaniesController < ApplicationController
def new
@company = Company.new
end
def create
@company = Company.new(secure_params)
if @company.valid?
else
render :new
end
end
private
def secure_params
params.require(:company).permit(:name)
end
end
приложение/контроллеры/addresses_controller.rb
class AddressesController < ApplicationController
def new
@address = Address.new
end
def create
@address = Address.new(secure_params)
if @address.valid?
else
render :new
end
end
private
def secure_params
params.require(:address).permit(:street)
end
end
Спасибо за вашу помощь. Я получил эту ошибку сейчас: 'undefined method 'address' для nil: NilClass'. Кажется, что моя объектная компания имеет значение null. Вы знаете, как создать экземпляр переменной? Потому что я не хочу сохранять данные формы в базе данных. Я просто хочу заполнить модель и отправить ее на удаленный веб-сервис. Я пытаюсь создать экземпляр этой переменной nil в форме с помощью '<% = @company = Company.new%>' и '<% = @ company.address = Address.new%>', но я получил 'undefined method humanize ' для nil: NilClass'. Вы можете мне помочь? –
Взгляните на свое имя приложения/models/address.rb: «класс Endereco» должен быть «class Address», не так ли? Если это не делает трюк, обновите сообщение с помощью последнего кода и включите код контроллера. Благодарю. – fabriciofreitag
Извините. Я делаю рефакторинг кода и переписываю все классы и методы. Теперь я не могу обновить код, потому что я работаю. Как можно скорее я обновлю его. –