2013-08-15 2 views
1

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

Я огляделся, как здесь Rails 3: Call functions inside controllers или API, но я не нашел подходящего решения.

У кого-нибудь есть лучший?

спасибо, что заранее.

+0

нет, вы должны передать этот процесс создания к действию обновления. Действие в контроллере сделано для ответа на запрос, я не думаю, что вы можете его вызвать из любой точки мира. Но у вас может быть защищенный метод в вашем контроллере, который создаст отчет, если он не существует. – MrYoshiji

+1

Хорошо. Поэтому я должен сделать что-то вроде этого: «private/def create_report (params) ..... end/and then (from action) def myaction ... report = create_report (myparams) ... end –

+0

MrYoshiji вы хорошо мудрости. Большое спасибо! –

ответ

4

Вы не должны вызывать действие своего контроллера из другого действия.

Почему? Поскольку каждое действие контроллера определено для ответа на запрос, который имеет несколько атрибутов (таких как IP, params, session, HTTP headers и т. Д.). Представьте себе, как «странно» было бы назвать действие от другого в Контроллере.

Если вы хотите сделать «лишнюю логику», которая не будет связана с действием обновления (например, создать), вы должны вызвать метод защиты (доступный только через контроллер) & его дочерних элементов) этого контроллера.

В вашем случае, вы могли бы сделать что-то вроде этого:

class ReportsController < ApplicationController 
    def update 
    @report = Report.where(id: params[:report_id]).first 
    if @report.nil? 
     create_report(params) 
    else 
     # etc. 
    end 
    end 

    protected 

    def create_report(params) 
    Report.create(params) 
    end 
end 
+0

Спасибо, мастер! Я очень ценю ваше время и усилия. –

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