私はサインアップのためのフォームを作成しています。クラスCompanyのcompanyという名前の属性を持つManagedCompanyという名前のクラスがあります。クラスCompanyは、Addressという別のクラスの属性を持っています。したがって、これらのクラスには作曲があります。OOPでのRubyと合成: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
、フォーム(Ruby on Railsののsimple_form)で、どのように私はアドレスオブジェクトから属性ストリートにアクセスすることができますか?
編集:コントローラーのコードを追加
アプリ/コントローラ/ 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' for nil:NilClass'。私のオブジェクト会社がnullであると思われます。変数をインスタンス化する方法を知っていますか?私はデータベース上のフォームデータを保存したくないからです。モデルを作成し、リモートWebサービスに送信するだけです。 '%@company = Company.new%>'と '<%= @ company.address = Address.new%>'でフォーム上にこれらの変数をインスタンス化しようとしましたが、 'undefined method humanize ' nilのための:NilClass'。手伝って頂けますか? –
あなたのapp/models/address.rbクラス名を見てください: "class Endereco"は "class Address"でなければなりませんか? これで解決できない場合は、投稿を最近のコードで更新し、コントローラコードを追加してください。ありがとう。 – fabriciofreitag
申し訳ありません。私はコードをリファクタリングし、すべてのクラスとメソッドを書き直しています。私は職場でコードを更新できません。できるだけ早く私はそれを更新します。 –