Предоставление частичного из контроллера в рельсах - программирование
Подтвердить что ты не робот

Предоставление частичного из контроллера в рельсах

У меня есть форма, которая добавляет строки в БД через remote = > true. Затем я хочу добавить новые данные в таблицу, но не могу получить правильное представление для рендеринга.

На данный момент он отображает всю страницу show.html.erb для новой записи, но я хочу, чтобы макет был добавлен как минимальная. Есть ли быстрый способ сообщить моему контроллеру, какой вид рендеринга после вставки в db? Я хочу сделать частичное имя _newly_added.html.erb

Мой контроллер

  def new
    @task = Task.new
    render :partial => "/tasks/newly_added", :locals => { :t => @task }
  end

Спасибо!!

ИЗМЕНИТЬ Я думаю, что мне нужно просто альтернативное представление "показать".

Я обнаружил, что метод, который мне нужно изменить, был на самом деле следующим:

  def create
    @task = Task.new(params[:task])

    respond_to do |format|
      if @task.save
        format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render json: @task, status: :created, location: @task }
      else
        format.html { render action: "new" }
        format.json { render json: @task.errors, status: :unprocessable_entity }
      end
    end
  end

Мне просто нужно сделать альтернативное представление просмотра, а затем передать это redirect_to этому представлению.

4b9b3361

Ответ 1

Отредактировано для изменений в вашем вопросе. Однако ничего не меняется. Вы думаете о том, что неправильно, и вам нужно настроить, как вы думаете. Вам не нужно альтернативное шоу, вам нужно обработать запрос format.js.

Частичное должно быть представлено в ответе JavaScript, а не в контроллере. Контроллер выглядит примерно так:

  def create
    @task = Task.new(params[:task])

    respond_to do |format|
      if @task.save
        format.html { redirect_to @task, notice: 'Task was successfully created.' }
        format.json { render json: @task, status: :created, location: @task }
        format.js
      else
        format.html { render action: "new" }
        format.json { render json: @task.errors, status: :unprocessable_entity }
        format.js
      end
    end
  end

Затем в представлении /tasks/create.js.coffee

($ '#mytable').append("<%= j render(partial: 'tasks/newly_added', locals: { t: @task }) %>")

Что здесь происходит, браузер обращается к create.js. Контроллер отвечает шаблоном create.js из-за блока respond_to format.js. j выводит содержимое файла _newly_added.html.erb, а его содержимое добавляется в таблицу. Контроллер не взаимодействует с существующим представлением, вместо этого JavaScript отправляется в браузер и взаимодействует с ним.

Все это немного изменится, если вы используете MVC-среду на стороне клиента, например Backbone или Ember, но вы не указали, что я предполагаю, что вы собираетесь с Rails-ресурсами.