Ruby on Rails показывает действие, не работающее с контроллера - PullRequest
2 голосов
/ 16 марта 2012

Я использовал scaffolding для сборки своего приложения RoR, затем добавил другое действие контроллера, называемое apply_configs. он работает нормально (все действия, которые я добавил к методу контроллера, выполняются нормально, и я могу сказать это по журналам на сервере), но я не могу заставить его отобразить нужную страницу после ее выполнения. Я добавил следующее в конец метода apply_configs в файле контроллера

respond_to do |format|
  if @l2vpn.update_attributes(params[:l2vpn])
    format.html { render action: "show", notice: 'L2vpn was successfully updated.' }
    format.json { head :ok }
  else
    format.html { render action: "edit" }
    format.json { render json: @l2vpn.errors, status: :unprocessable_entity }
  end
end

На сервере я вижу эти журналы

Started GET "/l2vpns/apply_configs? <long list of params goes here> " for 172.24.67.151 at 2012-03-16 11:32:01 -0700
Processing by L2vpnsController#apply_configs as */*
Parameters: { <long comma separated list of params goes here> }
L2vpn Load (0.4ms)  SELECT "l2vpns".* FROM "l2vpns" WHERE "l2vpns"."id" = ? LIMIT 1  [["id", 1]]
Rendered l2vpns/show.html.erb within layouts/application (1.9ms)
Completed 200 OK in 112ms (Views: 12.4ms | ActiveRecord: 1.2ms)

но на самом деле, в отличие от журналов, мой браузер не отображает содержимое show.html.erb, страница браузера не изменяется. Моя цель - показать show.html.erb после выполнения apply_configs.

У кого-нибудь есть идеи, как этого добиться, и почему он не работает, как я ожидал, с указанными выше конфигами?

ОБНОВЛЕННЫЙ КОД после комментария jdl

class L2vpnsController < ApplicationController
  respond_to :js, :html, :json
  # GET /l2vpns/1
  # GET /l2vpns/1.json
  def apply_configs
    @l2vpn = L2vpn.find(params[:id])

    <more code goes here>

    flash[:notice] = "Configs applied successfully!"
    respond_with(@l2vpn, :location => l2vpns_url)
  end

  <other controller action definitions go here>

end

Ответы [ 3 ]

0 голосов
/ 17 марта 2012

Из того, что я могу собрать, вы хотите перенаправить на действие show, а не визуализировать шаблон show.При непосредственном рендеринге шаблона show вы не собираете необходимые данные [например, саму модель] для правильной визуализации шаблона, поскольку это выполняется методом Controller.show.

Так как я нене знаю, как вы передаете идентификатор уязвимой модели, я предполагаю, что он передается как параметр с именем :id.

Ваш перенаправление будет выглядеть, если вы находитесь в том же контроллере (в противном случае, передайтеКонтроллер с :controller => 'controller':

format.html { redirect_to :action => 'show', :id => params[:id], :notice => 'L2vpn was successfully updated.' }

Второй вариант [хотя я лично его не использую] заключается в том, чтобы фактически визуализировать шаблон шоу напрямую, но затем вам нужно будет продублировать (или рефакторинг и вызов) большую часть того же кода, который выполняется в методе Controller.show. Точнее, вам нужно запустить ту часть кода, которая предоставляет данные для представления.

Например:

@model = Model.find(params[:id])
format.html { render action: "show", notice: 'L2vpn was successfully updated.' }
0 голосов
/ 21 марта 2012

Я беру дикое предположение, изменив запрос GET на POST, и это, вероятно, должно решить проблему.

Я предполагаю, что ваш "" больше допустимого количества символов, которые может иметь запрос GET, и ваш браузер задыхается от этого.

0 голосов
/ 16 марта 2012

Основная проблема в том, что вы не перенаправляете после обновления вашего объекта. Взгляните на этот контроллер Railscast на Rails 3 , особенно на части, связанные с respond_with, которые позаботятся о большей части этой работы для вас.

...