Как я могу получить доступ к методу в контроллере, который определен в модели? - PullRequest
1 голос
/ 21 июня 2019

Я довольно новичок в рельсах, и проект, над которым я работаю, требует от меня доступа к существующему методу.Тем не менее, это написано в модели, и я не уверен, как заставить его работать в контроллере, мой API должен набрать

Я попытался перенаправить метод в модель, но узнал, что яне могу этого сделать.Исходя из того, что я понял, так оно и будет работать, верно?

model.rb

def method_i_need
 //code
end 

controller.rb

def method_to_call_other_method
 //code
end

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Любой экземпляр класса будет иметь общедоступные методы экземпляра, доступные для вызова на объекте экземпляра. Распространено создание экземпляров класса модели в действии контроллера. Вот пример, поясняющий предыдущий ответ и комментарии, как вы можете сделать это в Rails.

class Person < ActiveRecord::Base
  def say_hello 
    language == 'DE' ? 'Guten Tag' : 'Hello'
  end
end

class PersonsController < ApplicationController
  def random_person 
    @random_person = Person.find(Person.pluck(:id).sample)  
    # you can now call @random_person.say_hello
  end

  def person_greetings
    # this examples assumes we only have 2 languages, EN and DE
    languages = Person.pluck(:language).uniq.sort
    @greetings = languages.each_with_object({}) do |language, hash|
      hash[language] = Person.new(language: language).say_hello 
    end 
  end
end  

# @greetings should return the following hash
=> {
    "DE" => "Guten Tag",
    "EN" => "Hello"
}

Аналогично, методы класса также могут вызываться напрямую, когда это необходимо, внутри метода действия контроллера, например, в модели у вас может быть определен такой метод класса внутри модели Person.

def self.languages
  pluck(:language).uniq.sort
end

Этот метод может быть вызван из любого контроллера или других классов, где это уместно, например:

def languages
  @people_count = Person.count # active record method to get number of people in database
  @languages = Person.languages
end

Где вы можете использовать это внутри вида действия контроллера

<div> 
  There are <%= @people_count %> total people in the system.
  Of them, <%= @languages.count %> languages are spoken.
  Those include the following:
  <ol>
    <% @languages.each do |language| %>
      <li><%= language %></li>
  </ol>
</div>
1 голос
/ 21 июня 2019

С риском кражи очков @ sergio ...

Если ваш метод определен внутри Model.rb, то в вашем контроллере будут работать оба следующих параметра:

def method_to_call_other_method
 Model.first.method_i_need
end


def method_to_call_other_method
 Model.find(params[:id]).method_i_need
end

Asкомментатор сказал, что вам просто нужен экземпляр вашей модели (Model.first или Model.find (params [: id])) и затем вызов метода, который вы определили в вашей модели, на экземпляре модели.И параметры [: id], очевидно, зависят от того, через какие параметры вы проходите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...