Passando parâmetros no rails redirect_to

202

Como passamos parâmetros em redirect_to em rails? Eu sei que podemos passar id usando isso:

redirect_to :action => action_name,:id => 3

Se eu quiser passar parâmetros adicionais, como alguns dados do formulário, como alcançá-lo?

EDITAR:

Para a sintaxe do Ruby 2, você deve atualizar o snippet acima para:

redirect_to action: action_name, id: 3
markiv
fonte
3
O que você está realmente tentando realizar? Você já pensou em salvar os dados na sessão?
Michael Sepcot 16/09/09
1
O que você está pedindo não é possível - se você estiver redirecionando, deve ser uma solicitação GET para a qual você está redirecionando, para que os parâmetros sempre estejam visíveis para os usuários. Você deve armazenar as coisas na sessão.
precisa saber é o seguinte

Respostas:

174

Basta anexá-los às opções:

redirect_to controller: 'thing', action: 'edit', id: 3, something: 'else'

Renderia /thing/3/edit?something=else

Michael Sepcot
fonte
22
Você não pode redirecionar com um POST. Dos documentos HTTP 1.1 sob as definições 3xx: "A ação necessária PODE ser executada pelo agente do usuário sem interação com o usuário, se e somente se o método usado no segundo pedido for GET ou HEAD." Expanda o que você realmente está tentando realizar e provavelmente podemos levá-lo na direção correta.
jdl
Oi Muito obrigado pela sua resposta. Eu sou um novato no desenvolvimento web. Estou tentando conhecer maneiras diferentes de invocar uma ação. Sua resposta esclareceu muitas das minhas dúvidas. Obrigado novamente :))
markiv 16/09/09
Afirmativo. Eu estou procurando isso há 1 hora.
86

Se você estiver usando recursos RESTful, poderá fazer o seguinte:

redirect_to action_name_resource_path(resource_object, param_1: 'value_1', param_2: 'value_2')

or
#You can also use the object_id instead of the object
redirect_to action_name_resource_path(resource_object_id, param_1: 'value_1', param_2: 'value_2')

or
#if its a collection action like index, you can omit the id as follows
redirect_to action_name_resource_path(param_1: 'value_1', param_2: 'value_2')

#An example with nested resource is as follows:
redirect_to edit_user_project_path(@user, @project, param_1: 'value_1', param_2: 'value_2')
Sohan
fonte
46

Se você tiver alguns dados do formulário, por exemplo, enviados para a ação home #, agora deseja redirecioná-los para a ação house # mantendo os parâmetros, poderá fazer isso

redirect_to act_house_path(request.parameters)

v4r
fonte
1
Você sabe como combinaria isso, além de novos parâmetros? ie request.parameters, (ou +): este =>: que
Chris Edwards
5
Você pode usar o método de mesclagem. Por exemplo:redirect_to act_house_path(request.parameters.merge(key: "value"))
GregT
3
Você também pode usar o método, exceto para excluir parâmetros indesejáveis após a fusão:redirect_to act_house_path(request.parameters.except(:authenticity_token, :controller, :action, :utf8, :commit)
mr io
39

Você pode passar objetos arbitrários para o modelo com o parâmetro flash.

 redirect_to :back, flash: {new_solution_errors: solution.errors}

E, em seguida, acesse-os no modelo por meio do hash.

<% flash[:new_solution_errors].each do |err| %>
vermasque
fonte
63
Essa é uma prática ruim. Este método usa incorretamente o objeto flash, destinado às mensagens do usuário. Melhor seria armazenar parâmetros arbitrários na sessão e depois limpá-los da sessão quando terminar.
precisa saber é o seguinte
30
redirect_to new_user_path(:id => 1, :contact_id => 3, :name => 'suleman')
Muhammad Suleman
fonte
7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id
Karwin
fonte
6
Você pode fornecer mais explicações? Apenas um exemplo de código não é realmente suficiente.
2171212 Simonmenke
7

Se você está procurando uma maneira de passar parâmetros adicionais de URL (não controlador, ação, ID etc.), aqui está um método robusto para fazer isso:

object_path(@object, params: request.query_parameters)

Isso transmitirá parâmetros utm ou quaisquer outros parâmetros adicionais que você não deseja perder.

Abram
fonte
4

routes.rb

 match 'controller_name/action_name' => 'controller_name#action_name', via: [:get, :post], :as => :abc

Qualquer controlador que você deseja redirecionar com parâmetros é fornecido abaixo:

redirect_to abc_path(@abc, id: @id), :notice => "message fine" 
Mitesh Sharma
fonte
3

Direcione seu caminho, pegue o paramse retorne:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Darlan Dieterich
fonte