【问题标题】:Ruby on rails and composition in OOP: How can I access attributes in simple_form?Ruby on rails 和 OOP 中的组合:如何访问 simple_form 中的属性?
【发布时间】:2016-07-03 18:48:46
【问题描述】:

我正在制作一个注册表格,我有一个名为 ManagedCompany 的类,它有一个名为 Company 的类 Company 的属性。类 Company 具有来自另一个名为 Address 的类的属性。所以,这些类中有作文。

类如下所示:

app/models/managed_company.rb

class ManagedCompany
  include ActiveModel::Model

  def initialize
    @company = Company.new
  end

  attr_accessor :name, :string
  attr_accessor :company, :Company

end

app/models/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

app/models/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)中,如何从地址对象访问属性街道?

编辑:添加控制器代码

app/controllers/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

app/controllers/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

app/controllers/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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 oop


    【解决方案1】:
     <%= form.input @company.address.street, autofocus: true %>
    

    【讨论】:

    • 感谢您的帮助。我现在收到此错误:undefined method 'address' for nil:NilClass。似乎我的对象公司为空。你知道如何实例化变量吗?因为我不想将表单数据保存在数据库中。我只想填充模型并发送到远程 Web 服务。我尝试使用&lt;%= @company = Company.new %&gt;&lt;%= @company.address = Address.new%&gt; 在表单上实例化这些零变量,但我得到了undefined method humanize' for nil:NilClass。你能帮帮我吗?
    • 看看你的 app/models/address.rb 类名:“class Endereco”应该是“class Address”,不是吗?如果这不起作用,请使用最新代码更新您的帖子并包含控制器代码。谢谢。
    • 很抱歉。我正在重构代码并重写所有类和方法。现在我无法更新代码,因为我在工作。我会尽快更新。
    • 代码是最新的并且现在与控制器一起使用。感谢您花时间帮助我。
    • 我相信我已经找到了解决方案。基本上,我为作为另一个属性的类的每个属性创建了一个循环。如果找到解决方案,我将完成代码并在此处发布。我也切换到 bootstrap_form_for 。但是示例:&lt;%= bootstrap_form_for @managed_companies do |form| %&gt; &lt;%= bootstrap_form_for @managed_companies.company.address do |form| %&gt; &lt;%= form.text_field :street, autofocus: true %&gt; &lt;% end %&gt; &lt;% end %&gt;。单击提交时我没有测试代码,但现在显示了表单。明天我会在这个问题上做更多的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多