2012-01-09 5 views
1

Просто сценарий - у меня есть две кнопки, оба из которых вызывают один и тот же контроллер/действие. Действие контроллера задает случайное число, @random_number.рельсы 3 - вызов одного и того же контроллера/действия, но с двумя разными изменениями вида

Если я нажму кнопку 1, я хочу, чтобы представление изменилось (через JS), отобразив @random_number в RED. Если я нажму кнопку 2, я хочу, чтобы представление изменилось (через JS), отобразив @random_number в ЗЕЛЕНОМ.

Что такое DRY-est способ сделать это? Мое понимание уровней контроллера/просмотра rails заключается в том, что каждый контроллер/действие связан с соответствующим представлением. Но в этом случае я хочу использовать одну и ту же бизнес-логику (сгенерировать случайное число) для обоих кликов, но результирующее представление зависит от того, какая кнопка нажата.

Один из вариантов - передать идентификатор кнопки контроллеру/действию, а затем использовать идентификатор кнопки в соответствующем файле RJS контроллера/действия для выполнения соответствующего javascript. Но моя кишка говорит мне, что это не лучший способ. Есть ли способ лучше?

Образец быстрого кода был бы очень признателен.

Спасибо.

+0

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

ответ

3

Вы должны иметь тот же вид и тот же метод контроллера, генерирующий случайное число. Тем не менее, на переднем конце вы должны использовать javascript или jquery, чтобы установить свойство цвета теста. Чтобы начать с такого подхода, вы можете изучить ajaxSuccess и щелкнуть связывание событий в jquery.

Другой подход, если вы хотите избежать использования javascript, заключается в установке значения данных в вашем поле ссылки (HTML5). Значение данных должно быть отправлено контроллеру как часть генерируемого запроса. Это нужно просто установить, когда вы показываете текст динамически. Таким образом, вы не будете повторять какую-либо часть кода в представлении или контроллере.

+0

Да, я надеялся сделать что-то похожее на то, что вы описали в первом абзаце. Но возникает два вопроса: 1) каков должен быть ответ для контроллера/действия, который устанавливает @random_number? 2) как я могу получить доступ к @random_number в обратном вызове ajaxSuccess? – deruse

+0

1) Ответ может быть одной из двух вещей: это может быть либо просто число, либо это может быть javascript, который выполняет манипуляции на стороне клиента. 2) Вы можете прочитать о том, как получить ответ в ajax: http://api.jquery.com/ajaxComplete/ –

+0

Ребята У меня есть аналогичный вопрос, который я не могу решить на основе этого ответа.Не могли бы вы взглянуть на него? http://stackoverflow.com/questions/34817690/rails-ajax-js-erb-same-route-more-actions –

2

Если это нужно, чтобы показать значение, если RED или GREEN, то почему бы не обработать его в интерфейсе (если это не то, что нужно сделать безопасным, тогда вы можете избежать шаблона на стороне сервера). Если вы хотите обработать это на сервере (чтобы он был защищен), вы могли бы вызвать два разных действия для Button-1 и Button-2 и переместить код, который генерирует случайное число, в private function, который вы можете вызывать из действия. Если необходимо передать какие-либо конкретные значения для генерации random number на основе выбранной кнопки, вы можете передать значения в private function и обрабатывать их там.

Что касается примера кода, я бы обработал его таким образом.

def action_for_button_1 
    @random_number = generate_random_number(args) 
    # render template to show in green 
end 

def action_for_button_2 
    @random_number = generate_random_number(args) 
    #render template to show in red 
end 


private 

def generate_random_number(args) 
    # generate the random number and return it. 
end 
+0

Да, это сработает. Предполагая, что мне нужно позвонить на сервер, есть ли способ сделать это одним действием? Предполагая, что это запрос AJAX, происходящий из /index.html, могу ли я закодировать логику обновления вида в самом index.html в виде двух обратных вызовов, по одному для каждой кнопки? Это в отличие от кодирования логики обратного вызова в action_for_button_1.rjs.erb и action_for_button_2_rjs.erb. Это возможно? – deruse

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