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

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


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')

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)


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| %>

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


7
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id

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.


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" 

3

Direcione seu caminho, pegue o paramse retorne:

redirect_to controller: "client", action: "get_name", params: request.query_parameters and return
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.