Подтвердить что ты не робот

Rails: передать параметры с помощью render: action?

У меня есть форма, которая отображается по-разному в зависимости от параметра, с которым он был вызван.

Исх.

testsite.local/users/new?type=client

Итак, если type был a или b, форма отобразила бы разные поля.

Моя проблема в том, что форма заполняется неправильно, потому что, если пользователь не может быть сохранен корректно, он отображает форму с сообщениями об ошибках по умолчанию, но также и без моего параметра.

testsite.local/users/new

Как я могу вызвать свое действие render и передать все настройки этого параметра? Так что я все еще могу сохранить свои встроенные сообщения об ошибках о том, почему форма не может быть правильно подобрана, и иметь ли она правильную форму?

Здесь мое действие create:

def create
   @user = User.new(params[:user])
   roles = params[:user][:assigned_roles]
   if @user.save
     update_user_roles(@user,roles)
     if current_user.is_admin_or_root?
       flash[:message] = "User \"#{@user.username}\" created."
       redirect_to users_path
     else
       flash[:message] = "Congrats! You're now registered!"
       redirect_to app_path
     end
   else
     render :action => 'new'
   end
 end
4b9b3361

Ответ 1

Как выяснил другой пользователь, отвечая на мой другой вопрос , вот что я был после:

form_for @user, :url => { :action => :create, :type => @type }

... который сохраняет параметр :type через каждое новое действие визуализации (если я правильно определил его в своем контроллере).

Ответ 2

Есть два способа сделать это.

Либо добавьте скрытое поле или дополнительный параметр в form_for

Добавление скрытого поля в вашу форму, содержащую именованный тип, и установить его равным параметрам [: type], это сохранит тип в рендере, если проверка не завершена.

Просмотр кода:

<% form_for @user do |f| %>
...
<%= hidden_field_tag :type, params[:type] %>
<%end%>

Добавление дополнительного параметра в форму:

<% form_for @user, create_user_path(@user, :type => params[:type]) %>
...
<%end%>

Либо один сделает то, что вы хотите.

Ответ 3

Извлечение для направляющих Rails

Использование render with: action является частым источником путаницы для новичков Rails. Указанное действие используется для определения вида представления для рендеринга, но Rails не запускает какой-либо код для этого действия в контроллере

Я полагаю, что ваш new?type=client используется для настройки какой-то переменной в вашем новом действии? И переменная позже будет использоваться в вашем представлении new.html.erb?

Затем вам нужно немного изменить свое действие для создания:

  else
     # add code here to setup any variable for type = client
     # and which will be used in your view
     render :action => 'new'
  end
 end

Ответ 4

Вы всегда можете заставить его:

params[:type] ||= "client"

в вашем новом действии в вашем контроллере. Если тип не задан, он будет по умолчанию клиентом. Однако URL-адрес не покажет это.