Rails - перенаправление после ошибок формы - PullRequest
3 голосов
/ 17 ноября 2011

Я очень плохо знаком с рельсами, поэтому, пожалуйста, прости мои ограниченные знания.

У меня есть контроллер с именем users. У него есть два метода: new и create.

Когда вызывается users#new, отображается форма для регистрации учетной записи на моем сайте. Я настроил для этого маршрут, который делает URL / регистрацию, например так:

match "signup" => "users#new", :as => "signup"

Когда пользователь переходит в / signup, я создаю новую переменную user instance и показываю им форму, например:

UsersController

def new
    @user = User.new
end

Новый вид

<%= form_for @user do |f| %>
<!-- Form code here... -->
<!-- Then at the end: -->
<%= f.submit :value => 'Sign Up' %>
<% end %>

Когда пользователь отправляет эту форму, он отправляет данные на users#create.

Мой код для users#create в UsersController выглядит так:

def create
    @user = User.new(params[:user])
    if @user.save
      redirect_to root_url, :notice => 'Signed Up!'
    else
      render "new"
    end
end

Оператор if / else проверяет, смог ли rails создать моего нового пользователя или нет. Если это так, он перенаправляет на индекс без проблем.

Если не удалось создать пользователя, он отображает мой новый вид и отображает ошибки в порядке.

Но URL-адрес, который он нам дает, это / users, потому что, когда он отправляет форму, он отправляет / users. Как я могу получить его, чтобы в случае сбоя регистрации он перенаправлялся в / signup и по-прежнему отображал ошибки, которые произошли?

ОБНОВЛЕНИЕ: rout.rb

Flightdb::Application.routes.draw do
  get "users/new"
  get "home/about"
  get "home/index"
  root :to => 'home#index'
  match 'about' => 'home#about'
  match "signup" => "users#new", :as => "signup"
  resources :users
end

Ответы [ 3 ]

0 голосов
/ 27 февраля 2012

Сегодня я столкнулся с той же самой проблемой, и, основываясь на комментариях Алекса и Мариан, я получил следующие изменения:

1) в виде формы:

<%= form_for @user, url: signup_path do |f| %>

2) в маршрутах .rb:

get "signup" => "users#new", :as => "signup"
post "signup" => "users#create"
resources :users
root :to => "home#index"

Я новичок в RoR, поэтому я буду рад комментариям, если есть какие-либо побочные эффекты или проблемы. Или, если есть какой-то лучший способ.

0 голосов
/ 22 августа 2013

маршрут действительно корректируется таким образом, но контекст соответствующего действия контроллера «users # new», такого как переменные, которые были инициализированы действием, теряется. Таким образом, мы оказываемся в некой нестабильной ситуации, когда мы не находимся ни в «новом» контексте, ни вне его ... Как контролировать этот контекст вопрос? Может быть, через ActiveModel :: Validator

Я не уверен, где и как изменить это поведение ...

0 голосов
/ 17 ноября 2011

Ну, ответ, который вы не хотите слышать, заключается в том, что это обычно не делается.Семантика URL не идеальна в любом случае./ new подразумевает новую новую форму ... но форма с ошибками является своего рода "частично созданным" пользователем.Пользователю никогда не потребуется использовать URL-адрес в любом случае, поэтому функциональность не теряется.

Также рассмотрите возможность размещения действий по регистрации и аутентификации на ресурсе «учетная запись» (единственном числе).контроллер / ресурс 'users', вероятно, должен быть только для внутреннего административного интерфейса.если на пользователя есть публичные профили, разместите их на ресурсе «профили».поместите панель пользователя на контроллере «панель мониторинга» (не ресурс).

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