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

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

Ex.

testsite.local/users/new?type=client

если type был a или b, форма будет отображать разные поля.

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

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

4 ответов


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

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

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


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

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

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

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

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

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

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

любой из них будет делать то, что вы хотите.


извлечение для направляющих рельсов

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

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

тогда вам нужно немного изменить бит вашего действия create выглядит так:

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

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

params[:type] ||= "client"

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