2016-07-03 1 views
0

Я делаю форму для регистрации, и у меня есть класс с именем 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 

ответ

0
<%= form.input @company.address.street, autofocus: true %> 
+0

Спасибо за вашу помощь. Я получил эту ошибку сейчас: 'undefined method 'address' для nil: NilClass'. Кажется, что моя объектная компания имеет значение null. Вы знаете, как создать экземпляр переменной? Потому что я не хочу сохранять данные формы в базе данных. Я просто хочу заполнить модель и отправить ее на удаленный веб-сервис. Я пытаюсь создать экземпляр этой переменной nil в форме с помощью '<% = @company = Company.new%>' и '<% = @ company.address = Address.new%>', но я получил 'undefined method humanize ' для nil: NilClass'. Вы можете мне помочь? –

+0

Взгляните на свое имя приложения/models/address.rb: «класс Endereco» должен быть «class Address», не так ли? Если это не делает трюк, обновите сообщение с помощью последнего кода и включите код контроллера. Благодарю. – fabriciofreitag

+0

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