2016-08-09 9 views
1

こんにちは私はフォームオブジェクトのリファクタリングパターンを使用しています。 ProjectとUserという2つのモデルがあります。そのようなRailsは別の名前で委譲します

Project.first.name # "Buy milk" 
User.first.name # "John Doe" 

私は、プロジェクトの名前とユーザーの名前を受け入れるフォームを持っています。

class UserForm 
    include ActiveModel::Model 

    def initialize(name:'', project_name:'') 
    @name = name 
    @project_name = project_name 
    end 

    def persisted? 
    false 
    end 

    def self.model_name 
    ActiveModel::Name.new(self, nil, "ProjectForm") 
    end 

    delegate :name, :email, to: :user 
    delegate :project_name, to: :project # PROBLEM: project has #name not #project_name method 

    def user 
    @user ||= User.new 
    end 

    def project 
    @project ||= Project.new 
    end 

end 

プロジェクトとユーザーの両方がフィールド名を持っているので、主な問題は、初期化とコードのデリゲート一部である、と私は初期化の両方のための@nameを持つことはできません。

delegate name: :project_name? 

ありがとうございました!今http://apidock.com/rails/Module/delegate

、あなたがこのような接頭辞のメソッドを呼び出すことができます:

UserForm.new.user_name 
UserForm.new.project_name 

答えて

0

あなたは

class UserForm 
    include ActiveModel::Model 

    def initialize(name:'', project_name:'') 
    @name = name 
    @project_name = project_name 
    end 

    def persisted? 
    false 
    end 

    def self.model_name 
    ActiveModel::Name.new(self, nil, "ProjectForm") 
    end 

    delegate :name, :email, to: :user, prefix: true 
    delegate :name, to: :project, prefix: true 

    def user 
    @user ||= User.new 
    end 

    def project 
    @project ||= Project.new 
    end 

end 

詳しい情報接頭辞を使用することができますフィールド。

delegate :name, to: :project, prefix: true 

project_nameとしてアクセスできます。

またそれはそれのために独自の接頭辞を指定することも可能です:

delegate :name, to: :project, prefix: :my_project 

それはmy_project_nameとしてそれにアクセスできるようになります。

http://apidock.com/rails/Module/delegate

3

委任あなたは委任のための接頭辞を指定することができます

0

プロジェクトフィールドは次のようになります。user_form[project][name]と自分のユーザー名がuser_form[user][name]でなければなりません。

フォームを正しくネストしてから、Project.new(user_form[project])に電話することができます。

これは、あなたがなど複数のフィールドを追加することを計画している場合

はRailsの強いのparamsを使用することを忘れないでくださいFAR良くスケール:http://api.rubyonrails.org/classes/ActionController/Parameters.html

関連する問題