0

最後に、私はその問題を解決することができました

Ruby on Rails 4 でフォーム オブジェクト パターンを実装しようとしましたが、間違いが見つかりません。

次のモデルを含む電話帳のサンプル アプリケーションを作成しました。

  • ファーストネーム
  • 苗字

電話番号

  • 番号

Eメール

  • 住所

[編集]
@sockmonk のおかげで、このコードの問題を 1 つ解決できました。それでもうまくいかない…

これが私が使用するコードです

# 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 %>

(コード全体はhttps://github.com/speendo/Phonebook2にあります)

ところで。お気づきかもしれませんが、このコードではVirtusを使用しています。これが重要かどうかはわかりません。

追加情報が必要な場合は、遠慮なくお知らせください。

4

2 に答える 2

2

PersonForm クラスには、次の属性があります。

attribute :person_first_name, String
attribute :person_last_name, String

しかし、new.html.erb では、:first_name と :last_name を参照するだけです。:first_name と :last_name も使用するように PersonForm を変更するか、:person_first_name と :person_last_name を使用するようにテンプレートを変更する必要があります。

于 2013-08-20T20:51:06.200 に答える
1

create メソッドは、代わりに @person_form.person にリダイレクトする必要があります。試す

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

 redirect_to person_path(@person_form.person)
end
于 2015-01-22T07:50:16.360 に答える