2016-11-29 8 views
-2

私はユーザモデル内にユーザのフルネームとユーザの組織のタイトルを示すメソッドを書く方法を理解しようとしています、1行で。Rails - 異なるモデルの属性を使用するメソッドを書く方法

私のユーザモデルでは、first_nameとlastname属性を一緒に追加するfull_nameというメソッドがあります。その部分は機能する。

ここで、organisation.titleにユーザーのフルネームを追加する 'formal_title'というメソッドを作成しようとしています。

私はユーザーと組織のモデルを持っています。関連がある:タイトル:

ユーザー

belongs_to :organisation 

組織

has_many :users 

マイ組織テーブルと呼ばれる属性があります。

私のユーザモデルにメソッドを書くことで私の試みは次のとおりです。

def full_name 
    if first_name.present? 
     [*first_name.capitalize, last_name.capitalize].join(" ") 
    else 
     test_full_name 
    end 
    end 

    def organisation_title 
    Organisation.title.where(organisation.id == self.organisation_id).titleize 
    end 

    def formal_title 
     [*self.full_name, self.organisation_title].join(",") 
    end 

私はこれをしようとすると、私が言うコンソールでエラーが出る:

NoMethodError: undefined method `formal_title' for #<User:0x007fea3495fe90> 

このエラーメッセージはありませんになりますが私がこれをテストしているユーザーには、テストするための名字、姓、組織IDがあるため、私に感謝します。ユーザーテーブルのorganisation_idはタイトルを持つ組織を参照しているので、このメソッドの一部が欠けている可能性があるのはなぜですか、コンソールがそのメソッドについて知らないものについては混乱しています。

私は間違ったことを誰にでも見せてもらえますか?

全体のユーザーモデルがあります:

class User < ApplicationRecord 
    rolify strict: true # strict means you get true only on a role that you manually add 
    attr_accessor :current_role 


    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
       :confirmable, :lockable, 
     :omniauthable, :omniauth_providers => [ :linkedin, :twitter, :orcid ] 


    # --------------- associations 

    belongs_to :organisation, optional: true 

    has_one :device 
    has_many :identities, dependent: :destroy 
    has_one :profile, dependent: :destroy 
    has_one :setting, dependent: :destroy 
    has_one :org_request, dependent: :destroy 
    has_many :proposals, dependent: :destroy 

    # Conversations 
    has_many :authored_conversations, class_name: 'Conversation', foreign_key: 'author_id' 
    has_many :received_conversations, class_name: 'Conversation', foreign_key: 'received_id' 
    has_many :personal_messages, dependent: :destroy 
    # End Conversations 

    # teams 
    has_many :teams, foreign_key: "team_mate_id" 
    has_many :team_projects, through: :teams, source: :proposal 
    has_many :received_invitations, :class_name => "TeamInvitation", :foreign_key => 'recipient_id' 
    has_many :sent_invitations, :class_name => "TeamInvitation", :foreign_key => 'sender_id' 




    # --------------- scopes 

    # --------------- validations 

    validates :first_name, presence: { message: 'First name cannot be blank.' } 
    validates :last_name, presence: { message: 'Last name cannot be blank.' } 
    validates :email,  format:  { with: EMAIL_REGEX } 
    validates :email,  uniqueness: { message: 'This email is already associated with an account. Try logging in.'} 

    # validates_format_of :first_name, with: /a-zA-Z/ 
    # validates_format_of :last_name, with: /a-zA-Z/ 
    # validates_length_of :password, within: 8..128 


    # --------------- class methods 

    def full_name 
    if first_name.present? 
     [*first_name.capitalize, last_name.capitalize].join(" ") 
    else 
     "test_full_name" 
    end 
    end 

    def organisation_title 
    # you don't need to do `Organisation.where...` here because you have defined the `belongs_to` association for `:organisation`. So, it will directly give you the `Organisation` object. 
    organisation.title.titleize 
    end 

    def formal_title 
     [*self.full_name, self.organisation_title].join(",") 
    end 
    # --------------- instance methods 
    def online? 
    true 
    # false 
    # !Redis.new.get("user_#{self.id}_online").nil? 
    end 



end 
+0

コンソールでreload!を呼び出すことによって、あなたのレールコンソールを再ロードしていることを確認してください。 – dnsh

+0

@dnsh - 再ロード!毎回。 – Mel

+0

これはどのレールバージョンですか? – Fallenhero

答えて

1

I save my changes each time. then I reload! in the console.

が足りません。コンソールを再起動するか、ユーザーに再問い合わせする必要があります。

u = User.find(u.id) 

reload!は、すでにロードされたオブジェクトには影響しませんので、あなたが持っていたユーザーは、それが新しいメソッドは表示されません。

1

このようなあなたのコードを変更し、私はそれが与えるもの知らせてみてください:

def full_name 
    if first_name.present? 
    [first_name.capitalize, last_name.capitalize].join(" ") 
    else 
    test_full_name # will work if test_full_name is defined inside this class 
    end 
end 

def organisation_title 
    # you don't need to do `Organisation.where...` here because you have defined the `belongs_to` association for `:organisation`. So, it will directly give you the `Organisation` object. 
    organisation.title.titleize 
end 

def formal_title 
    [self.full_name, self.organisation_title].join(",") 
end 
+0

こんにちは - 提案のおかげで。私はまだこのエラーが発生します:u.formal_title NoMethodError:未定義のメソッド 'formal_title 'for# Mel

+0

ゲッターの前に' self'を付ける必要はありません。 –

+0

@Jagdeep - これに感謝します。組織のタイトルのあなたのバージョンが働いた。私は再起動せずにコンソールから結果を得ることができませんでした。私はリロードが十分ではなかったことを知らなかった。助けてくれてありがとう。 – Mel

関連する問題