Camping: вернуть пользователя к последним записям, но сохранить ошибки - PullRequest
2 голосов
/ 12 апреля 2010

Пользователи могут просматривать определенные записи в моем веб-приложении с URL-адресом. /entry/8, например. Если запись не существует, «Запись не найдена» добавляется к @messages, и я отображаю страницу ошибки.

Я хотел бы показать какой-то произвольный запрос вместо пустой страницы, но я не могу найти хороший способ сохранить сообщение об ошибке для отображения. Есть и другие действия, которые должны выполняться в контроллере произвольного запроса, поэтому я не могу просто скопировать запрос и render :posts.

Пример кода:

module MyApp::Controllers
  class ComplexQuery < R '/query'
    def get
      @entries = Entries.all(:conditions => someComplexConditions)
      until @entries.complexEnough? then @entries.makeMoreComplex! end
    end
  end

  class SingleEntry < R '/entry/(\d+)'
    def get(id)
      @entries = Entries.find_all_by_id(id)
      unless @entries.nil?
        render :posts
      else
        @messages = ["That entry does not exist."]
        render :blank  # I want to run Controllers::ComplexQuery, instead of rendering a blank page.
      end
    end
  end
end

Ответы [ 2 ]

3 голосов
/ 25 июля 2010

Как то так?

def get(id)
  @entries = Entries.find_all_by_id(id)
  unless @entries.nil?
    render :posts
  else
    r *MyApp.get(:ComplexQuery)
  end
end

См. Camping.method_missing .

Но я бы также рекомендовал переместить ComplexQuery во вспомогательный метод:

module MyApp::Helpers
  def complex_query(conditions); end
end

Тогда вы можете complex_query(something) как в SingleEntry, так и в ComplexQuery.

0 голосов
/ 12 апреля 2010

Попробуйте это:

@entry = Entry.find_by_id(params[:id]) # returns nil when not found
if @entry.nil?
  flash[:notice] = "Entry not found"
  render :action => "recent" 
end
...