私はユーザモデル内にユーザのフルネームとユーザの組織のタイトルを示すメソッドを書く方法を理解しようとしています、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
コンソールでreload!を呼び出すことによって、あなたのレールコンソールを再ロードしていることを確認してください。 – dnsh
@dnsh - 再ロード!毎回。 – Mel
これはどのレールバージョンですか? – Fallenhero