Модификация response_to в Rails 3
Вот предпосылка:
У меня есть модель с именем Rules, которая имеет соответствующий контроллер и представление. Я бы хотел, чтобы пользователь мог создавать новое правило из своей панели инструментов, которая имеет отдельное представление и контроллер.
На панели инструментов есть три вкладки: "Правила", "Наборы правил" и "Игры". Каждая вкладка имеет свою частичную часть, поэтому для правил я использую частичную часть _rules.erb, которая выглядит следующим образом.
<div id="dashboard-rules" class="dashboard-panel ui-nav-panel">
<%= button_to'Create A Rule', '#', id: "create-rule-btn", class: "btn btn-primary" %>
<div id="create-rule-form-container">
</div>
...
</div>
Используя jQuery, я загружаю содержимое страницы новых правил, которая контролируется контроллером правил, например так...
$('#create-rule-btn').click (e) ->
e.preventDefault()
$('#create-rule-form-container').load('/rules/new.html .form-horizontal')
Это загружает только форму из rules/new.html. Моя проблема в том, что когда я нажимаю кнопку "Сохранить правило", он перенаправляется на URL /rules. И затем либо отображает ошибки, либо говорит: "Правило успешно сохранено". Я бы хотел, чтобы он не перенаправлял и отображал ошибки на панели инструментов... опять же, не перенаправлял на /rules URL.
Это моё действие создания правил, которое, я думаю, нужно изменить, я просто не знаю, как:
def create
@rule = Rule.new(params[:rule])
respond_to do |format|
if @rule.save
format.html { redirect_to @rule, notice: 'Rule was successfully created.' }
format.json { render json: @rule, status: :created, location: @rule }
else
format.html { redirect_to :controler => "dashboard"}
format.json { render json: @rule.errors, status: :unprocessable_entity }
end
end
end
Я знаю, что мне нужно разобраться с тем, как работает response_to, я просто не знаю как.
1 ответ
Помните, что вам нужно установить все переменные, которые вы установили на панели инструментов в действии create, чтобы сработало следующее. Это потому, что вы визуализируете тот же шаблон, что и панель мониторинга, поэтому вам нужно снова установить переменные.
if @rule.save
format.html { redirect_to dashboard_path, notice: 'Rule was successfully created.' }
format.json { render json: @rule, status: :created, location: @rule }
else
# initialize the variables needed on the dashboard here
format.html { render template: 'dashboard/index' }
format.json { render json: @rule.errors, status: :unprocessable_entity }
end
Еще одно решение - отправить форму через ajax и просто обновить страницу при сохранении правила.
ОБНОВЛЕНИЕ: быстрое решение JS
в форме, которая создает правила, добавьте следующее
form_for @rule, html: { remote: true } do |f|
Это отправит форму через ajax. В вашем контроллере добавьте format.js
строка после каждого format.json
format.json { ... }
format.js
затем создать app/views/rules/create.js.erb
(или хамл) файл. В файл вы можете добавить любой JS, который вы хотите, поэтому добавьте следующее
<% if @rule.errors.any? %>
# add js here to append the errors in the page
<% else %>
window.location.reload
<% end %>