1

Например, я размещаю частичный <%= render "layouts/location" %> во взглядах по всему сайту. Мне нужен контроллер для макета (я пробовал layouts_controller.rb), так что я мог бы сделатьКак вы определяете функцию для частичного в контроллере для работы во всех представлениях? Ruby on Rails

def _location 
    @city = request.location.city 
    @state = request.location.state 
    end 

Парциальным содержит код <%= @city %>, <%= @state %>

Это все эффективно, как предполагается, чтобы отобразить город и состояние посетителя на любой странице, на которой выполняется частичное.

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

Если вы являетесь владельцем приложения, проверьте свои журналы.

Итак, вопрос в том, как определить функцию для частичного?

+0

Используется ли это для частичного использования _a lot_? Потому что вы можете установить 'before_filter' в' ApplicationController', который установил бы эти переменные для вас. Даже если ваша часть используется, скажем, на 40% ваших страниц, было бы неважно, что по каждому запросу потребовалось несколько миллисекунд, чтобы установить эти переменные. – MrDanA

+0

Yeh, как 70% страниц, мог бы я before_filter тогда определить местоположение? или _location? или ? – Laser

+0

Я приведу пример в качестве ответа. – MrDanA

ответ

3

Вы можете сделать это в перед фильтром в контроллере приложения следующим образом:

... 
before_filter :location 

def location 
    @city = request.location.city 
    @state = request.location.state 
end 

Имя метода должно соответствовать символ в before_filter вызова, но кроме этого, вы можете позвонить метод, который вы хотите. Однако метод должен быть в классе ApplicationController.

Уточнение: Это будет вызвано перед каждым запросом в вашем приложении и установит для вас эти две переменные экземпляра, поэтому в каждом представлении вы всегда и автоматически будете иметь доступ к @city и @state.

2

Я чувствую, что вы можете сделать несколько улучшений от других решений.

В ApplicationController

class ApplicationController < ActionController::Base 
    before_filter :set_location, only: [:index, :show, :edit] 

    def set_location 
     @city = request.location.city 
     @state = request.location.state 
    end 
end 

Вполне вероятно, что вам не нужны эти переменные для создания, обновления и разрушающих действий, поэтому использование only: [...] кажется хорошей идеей. Вы можете добавить туда другие настраиваемые методы. Основная проблема с этим будет, когда ваше действие create завершится неудачно, и вы захотите отобразить страницу редактирования. Если вам не нужны эти переменные на странице редактирования, все в порядке. В противном случае, вам нужно позвонить set_location себя:

def create 
    @lala = Lala.new(...) 
    @lala.save 
    set_location if @lala.errors.any? 
    respond_with @lala 
end 

Кроме того, в 30% страниц, которые не нужны эти переменные, вы можете использовать skip_before_filter:

class BlogsController < ApplicationController 
    #assume you dont need those variables in your blog 

    skip_before_filter :set_location # you can also use only: [:index, ...] here 
end 
1

Вы должны принять посмотрите на cells. Это потрясающий, но довольно неизвестный камень, который позволяет вам структурировать ваше приложение в «ячейках». Это может быть именно то, что вам нужно.

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