Модификация 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 %>
Другие вопросы по тегам