Ruby on rails 如何实现表单对象

Ruby on rails 如何实现表单对象,ruby-on-rails,forms,design-patterns,nested-forms,Ruby On Rails,Forms,Design Patterns,Nested Forms,我终于解决了这个问题 我试图在RubyonRails4中实现一个表单对象模式,但我找不到我的错误 我为电话簿构建了一个示例应用程序,其中包括以下模型 人 名字 姓 电话号码 数 电子邮件 地址 [编辑] 多亏了@sockmank,我可以解决这段代码中的一个问题。但它仍然不起作用 这是我使用的代码 # app/models/person.rb class Person < ActiveRecord::Base has_many :phone_numbers has

我终于解决了这个问题

我试图在RubyonRails4中实现一个表单对象模式,但我找不到我的错误

我为电话簿构建了一个示例应用程序,其中包括以下模型

  • 名字
电话号码

电子邮件

  • 地址
[编辑]
多亏了@sockmank,我可以解决这段代码中的一个问题。但它仍然不起作用

这是我使用的代码

# app/models/person.rb
class Person < ActiveRecord::Base
    has_many :phone_numbers
    has_many :emails
end

# app/controllers/people_controller.rb
class PeopleController < ApplicationController
    def new
        @person_form = PersonForm.new
    end

    def create
        @person_form = PersonForm.new(person_form_params)
        @person_form.save

        redirect_to person_path(@person)
    end

    def index
        @people = Person.all
    end

    def show
        @person= Person.find(params[:id])
    end

private

    def person_form_params
        params.require(:person_form).permit(:person_first_name, :person_last_name, :phone_number_number, :email_address)
    end
end

# app/forms/person_form.rb
class PersonForm
    include Virtus

    include ActiveModel::Model
#   extend ActiveModel::Naming
#   include ActiveModel::Conversion
#   include ActiveModel::Validations

    attr_reader :person
    attr_reader :phone_number
    attr_reader :email

    attribute :person_first_name, String
    attribute :person_last_name, String
    attribute :phone_number_number, Integer
    attribute :email_address, String

    def persisted?
    false
  end

    def save
        if valid?
            persist
            true
        else
            false
        end
    end

private

    def persist
        @person = Person.create(first_name: person_first_name, last_name: person_last_name)
        @phone_number = @person.phone_numbers.create(number: phone_number_number)
        @email = @person.emails.create(address: email_address)
    end
end
# app/views/people/new.html.erb
<h1>New Person</h1>

<%= form_for :person_form do |f| %>
    <p>
        <%= f.label :person_first_name %> </ br>
        <%= f.text_field :person_first_name %>

    <p>
        <%= f.label :person_last_name %> </ br>
        <%= f.text_field :person_last_name %>

    <p>
        <%= f.label :phone_number_number %> </ br>
        <%= f.text_field :phone_number_number %>

    <p>
        <%= f.label :email_address %> </ br>
        <%= f.text_field :email_address %>  
<% end %>
#app/models/person.rb
类Person
(在上找到整个代码)

顺便说一句,正如你可能已经注意到的,我在这个代码中使用-不知道这是否重要


如果您需要任何其他信息,请随时通知我。

在PersonForm类中,您具有以下属性:

attribute :person_first_name, String
attribute :person_last_name, String

但是在新的.html.erb中,您只需引用:first_name和:last_name。您需要将PersonForm更改为同时使用:first\u name和:last\u name,或者将模板更改为使用:person\u first\u name和:person\u last\u name。

在PersonForm类中,您具有以下属性:

attribute :person_first_name, String
attribute :person_last_name, String

但是在新的.html.erb中,您只需引用:first_name和:last_name。您需要将PersonForm更改为同时使用:first\u name和:last\u name,或者将模板更改为使用:person\u first\u name和:person\u last\u name。

创建方法应改为重定向到@person\u form.person。 试一试


create方法应该重定向到@person\u form.person。 试一试


哎哟你是对的!我纠正了这个错误,但代码仍然不起作用。。。请道歉,但我会回收这个线程来解决整个问题。希望这没问题……哎哟!你是对的!我纠正了这个错误,但代码仍然不起作用。。。请道歉,但我会回收这个线程来解决整个问题。希望这是好的。。。