简体   繁体   中英

Call a Method Model inside Controller

I have the following model; (app/models/student_inactivation_log.rb)

class StudentInactivationLog < ActiveRecord::Base
    belongs_to :student
    belongs_to :institution_user
    belongs_to :period

    validates_presence_of :student_id, :inactivated_on, :inactivation_reason

    INACTIVATION_REASONS = [{ id: 1, short_name: "HTY", name: "You didn't study enough!"},
                            { id: 2, short_name: "KS", name: "Graduated!"},
                            { id: 3, short_name: "SBK",name: "Other Reason"}]

    Class methods
        class << self
        def inactivation_reason_ids
            INACTIVATION_REASONS.collect{|v| v[:id]}
        end

        def inactivation_reason_names
            INACTIVATION_REASONS.collect{|v| v[:name]}
        end

        def inactivation_reason_name(id)
          INACTIVATION_REASONS.select{|t| t[:id] == id}.first[:name]
        end

        def inactivation_reason_short_name(id)
          INACTIVATION_REASONS.select{|t| t[:id] == id}.first[:short_name]
        end

        def inactivation_reason_id(name)
          INACTIVATION_REASONS.select{|t| t[:name] == name}.first[:id]
        end
    end

    # Instance methods
    def inactivation_reason_name
        self.class.inactivation_reason_name(self.inactivation_reason)
    end

    def inactivation_reason_short_name
        self.class.inactivation_reason_short_name(self.inactivation_reason)
    end

    def inactivation_reason_id
        self.class.inactivation_reason_id(self.inactivation_reason)
    end
end

I would like to call these inactivation reasons from my controller, which is app/controllers/student/session_controllers.rb file:

class Student::SessionsController < ApplicationController
    layout 'session'

    def create
        student = Student.authenticate(params[:student_number], params[:password])
        if student.active
            session[:student_id] = student.id
            redirect_to student_main_path, :notice => 'Welcome!'
        elsif (student and student.student_status == 3) or (student and !student.active)
            flash.now.alert = "You can't login because #REASON_I_AM_TRYING_TO_CALL"
            render 'new'
        else
            ....
    end
end

I would like to show students their inactivation reason on the systems if they can't login.

How can I call my INACTIVATION_REASONS from this controller file? Is it possible?

Thanks in advance!

That's just a constant, so you can call it as constant anywhere.

StudentInactivationLog::INACTIVATION_REASONS

Update

I realized actually what you want is to use a reason code or short name saved in db to represent the string.

If so, I recommend you to use the short name directly as Hash. "id" looks redundant for this light case.

INACTIVATION_REASONS = {"HTY"=>"You didn't study enough!",
                        "KS"=>"Graduated!",
                        "SBK"=>"Other Reason"}

validates :inactivation_reason, inclusion: { in: INACTIVATION_REASONS.keys,
  message: "%{value} is not a valid short name" }

def full_reason_message
  INACTIVATION_REASONS[self.inactivation_reason]
end

Then, to show full message of a reason in controller

reason = @student.full_reason_message

This is the idea. I havn't checked your other model codes. You'll need to save reason as the short name instead of id, and need to revise/remove some code if you decide to use it in this way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM