2016-08-09 35 views
1

嗨,我使用表單對象重構模式。 我有兩個模型,項目和用戶。這樣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兩個在initialize。有沒有辦法像

delegate name: :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 

更多信息:http://apidock.com/rails/Module/delegate

現在,你可以調用前綴的方法是這樣的:

UserForm.new.user_name 
UserForm.new.project_name 
3

委託允許委派的指定前綴領域。

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

它將允許訪問它作爲project_name

或者它可以指定自己的前綴吧:

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

它將允許訪問它作爲my_project_name

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

相關問題