Post Redirect Получить шаблон в Rails - PullRequest
6 голосов
/ 03 мая 2011

Как я могу реализовать PRG в Rails?

Я использовал PRG в Rails, но я не совсем уверен, что это правильно.Мне было интересно, есть ли лучший способ справиться с этим в Rails?

Ответы [ 6 ]

5 голосов
/ 09 мая 2011

Я не знаю, насколько популярен шаблон PRG и почему нужно неукоснительно придерживаться «перенаправления» в случае его сбоя (на самом деле, одна веская причина - иногда вы не хотите иметь дело со сложностью «установки» всоздать провал и держать вещи сухими).

То, что вам в основном нужно, это перенести параметры для: user на new.Я думаю, что решение @ Hitesh выше очень близко.

class UsersController < ApplicationController

  def new
    if flash[:user_params]
      @user = User.new(flash[:user_params])
      @user.valid?
    else
      @user = User.new
    end
  end

  def create
    @user = User.new(params[:user])

    if @user.save
      # clears previously stored user if there is any
      flash[:notice] = "User created."
      redirect_to '/'
    else
      flash[:error] = "Error saving User"
      flash[:user_params] = params[:user]
      redirect_to :action => :new
    end
  end
end
1 голос
/ 09 мая 2011

Я не эксперт в этих вопросах, но это выглядит хорошо.Из того, что я понимаю, вспышка является частью сессии.Так что ответы, подсказывающие вам переключиться на сессию, кажутся немного ошибочными.В этом случае вы хотите, чтобы данные были очищены после перенаправления.Кроме того, что вы не добавили его в сеанс, я не уверен, куда вы его поместите.

Поскольку размер вашего файла cookie увеличивается, ну, в качестве поставщика сеансов по умолчанию для Rails используется файл cookie в Rails 3. Вы могли бызамените поставщика сеанса, если вы хотите сохранить сторону сервера данных.Тем не менее, он зашифрован, так что вы, вероятно, в порядке с данными в cookie, если размер не является проблемой.

1 голос
/ 09 мая 2011

Используйте сеанс, Люк

Способ, которым вы реализовали его в своем блоге, вполне подходит, однако вы можете использовать session вместо flash для хранения @user и, при желании, использовать ActiveRecord Хранилище сеансов для не допускать вздутия печенья.

Из ActionController :: Base Документация

ActiveRecord :: SessionStore - Сеансы хранятся в вашей базе данных, которая работает лучше, чем PStore с несколькими серверами приложений, и, в отличие от CookieStore, скрывает содержимое вашего сеанса от пользователя. Чтобы использовать ActiveRecord :: SessionStore , установите

config.action_controller.session_store = :active_record_store

в вашем config/environment.rb и запустите rake db:sessions:create.

Так что вы должны ...

class UsersController < ApplicationController

  def new
    @user = session[:user] || User.new
  end

  def create
    @user = User.new(params[:user])

    if @user.save
      # clears previously stored user if there is any
      session[:user] = nil
      redirect_to '/'
    else
      session[:user] = @user
      redirect_to :action => :new
    end
  end
end
0 голосов
/ 13 января 2012

Я не правильно прочитал вопрос.

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

Для этого флеш-хэш выглядит неправильно.Я бы согласился с идеей вставки введенных вами данных в сеанс и перенаправления.

0 голосов
/ 10 мая 2011

Правда, что вы не должны делать redirect_to '/'. Вы должны определить root в вашем файле маршрутов и затем сделать redirect_to root_path.

Редактировать: Упс, это должен был быть комментарий к ответу SpyrosP.

Также: Вот несколько советов по совершенству на вспышке. Особенно это может облегчить ваш разум:

Флэш - это особая часть сеанса, которая очищается при каждом запросе. Это означает, что сохраненные там значения будут доступны только в следующем запросе, что полезно для хранения сообщений об ошибках и т. Д.

Интересно то, что да, это часть сеанса, поэтому ответы «использовать сеанс вместо флэш» ошибочны, как уже сказал ответ Джастина Этереджа. Другое дело, что в нем говорится, что полезно для хранения сообщений вместо только для хранения сообщений. С добавленным «и т. Д.» Я бы поверил, что он также предназначен для хранения там информации о пользователях.

И последнее, я бы согласился с Адитьей Санги, что вы должны просто хранить пользовательские параметры, а не весь пользовательский объект во флэш-памяти.

0 голосов
/ 09 мая 2011

используйте ниже код

class UsersController < ApplicationController

  def new
    @user = User.new(session[:user_param])
   session[:user_param]=nil
  end

  def create

    @user = User.new(params[:user])

    if @user.save
      # clears previously stored user if there is any
      flash.discard(:user)
      redirect_to '/'
    else
      session[:user_param] = @user
      redirect_to :action => :new
    end

  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...