2016-03-15 3 views
0

Как я понимаю, маршруты доставят вас от начальной точки к контроллеру и к действию. Действие вызывает связанные представления; так что, если мне не нужны какие-либо представления для моего контроллера и просто хочу просто вызвать базовый метод контроллера, не отображая вид или маршрут.Ruby on Rails маршруты к контроллерам

Скажем, у меня есть FoodsController с несколькими методами, и в этом контроллере существуют методы торта, пиццы и чипов. Каждый запрашивает базу данных для секретного сообщения и сохраняет ее в переменной, но запрос на это будет поступать из какой-то другой части нашего приложения.

Для этого я должен использовать маршрут для этого или какого-то точечного синтаксиса, такого как food.cake().

Так что я думаю, что я пытаюсь сказать, эй, «Сервер», сделайте это и вернитесь туда, где вы остановились после его завершения.

+0

проверьте это, http://stackoverflow.com/questions/14806310/forcing-http-response-to-return-status-200-in-rails – anoop

ответ

0

Контроллер предназначен только для конечных точек URL. Например, если вы нажмете http://my.app/my_route, вам необходимо сопоставить часть my_route с действием контроллера в вашем файле routes.rb. Но что произойдет, если вы напечатаете это в свой браузер? Вы хотите увидеть что-то в порядке? Поэтому вам нужно вернуть некоторые данные (json, html, erc). Вы можете использовать для этого render.

Это отличается от написания «нормального» кода Ruby, то есть Ruby вне веб-фреймворка. Вы понимаете, что такое класс и как работает следующее?

class MyClass 
    def initialize 
    end 
    def my_method 
    puts "my_method_called" 
    end 
end 

MyClass.new.my_method # => "my_method_called" 

Это очень простой рубин и работает в Rails, как хорошо, хотя есть некоторые правила о том, где код должен быть написан.

Кстати, если вы действительно хотите, чтобы сделать действие контроллера, который не оказывает никакого, просто использовать:

render text: "", status: 204 
return false 

Статус: 204 означает «No Content».

+0

Итак, что-то вроде PostController.new.create ... call class. то новый для нового экземпляра класса, наконец, метод в классе? – failpractice

+0

Ответ нет, но это хороший вопрос. Контроллеры - это особый случай, когда вы никогда не копируете их напрямую, все, что происходит за кулисами при вводе URL-адреса.Если вы просто хотите использовать вспомогательный метод, который вы можете использовать в любом месте, вы можете сделать его методом класса на одной из ваших моделей или написать новый класс/модуль в папке 'config/initializers /'. –

+0

Тогда, если я могу создать класс в конфигурациях/инициализаторах или в модели, то к ним можно получить доступ из других мест, почему у нас даже есть контроллеры. Почему бы просто не сделать одного помощника, который выполняет все основные методы CRUD, и просто продолжайте передавать ему модель, если вы хотите выполнить один из этих методов в классе – failpractice

0

Вы можете использовать рендеринг json или текст, если метод ничего не отображает, я думаю, что он должен быть закрытым.

+0

Итак, я хочу, чтобы вызвать метод, который не имеет взгляд должен быть в частном разделе? – failpractice

+0

Если метод не отображает значение или представление, сделайте его закрытым, потому что он используется только в контроллере не для публики. – Yaser

+0

Если вы не хотите менять вид или действие, вы можете сделать ajax и вернуть json. – Yaser

0

В вашем примере вы можете использовать метод торта в другом контроллере, как так:

cake = Food.cake 

Пожалуйста, обратите внимание, что этот метод должен жить в модели еды, а не контроллер, так как вам не нужен вид.

+0

Является ли часть продуктов, вызывающая модель или контроллер? У меня создалось впечатление, что вам нужно вызвать контроллер множественного числа и модель единственного числа. – failpractice

Смежные вопросы