Params do Rails explicados?

228

Alguém poderia explicar paramsno controlador Rails: de onde eles vêm e o que eles estão fazendo referência?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

Gostaria de poder ler este código linha por linha e entender o que está acontecendo.

Dru
fonte
2
Qual é a sua experiência em desenvolvimento web no servidor? Quais tecnologias você já conhece?
Maurício Linhares
3
Estive com HTML e CSS por anos. Classes tiradas que usavam PHP, JS e Java. Embora usei muito pouco MVC com php. Eu realmente aprendi a programação usando Java. E eu entendo completamente a teoria do banco de dados.
Dru

Respostas:

281

Os parâmetros vêm do navegador do usuário quando solicitam a página. Para uma solicitação HTTP GET, que é a mais comum, os parâmetros são codificados no URL. Por exemplo, se o navegador de um usuário solicitou

http://www.example.com/?foo=1&boo=octopus

então params[:foo]seria "1" e params[:boo]seria "polvo".

Em HTTP / HTML, os parâmetros são realmente apenas uma série de pares de valores-chave em que a chave e o valor são cadeias de caracteres, mas o Ruby on Rails possui uma sintaxe especial para tornar os parâmetros um hash com hashes internos. Por exemplo, se o navegador do usuário solicitou

http://www.example.com/?vote Quepasa

então params[:vote]seria um hash, params[:vote][:item_id]seria "1" e params[:vote][:user_id]seria "2".

Os parâmetros do Ruby on Rails são equivalentes à matriz $ _REQUEST no PHP .

David Grayson
fonte
13
Equivale a $ _REQUEST, exceto que $ _REQUEST inclui dados de obtenção, postagem e cookie, enquanto os parâmetros apenas obtêm e publicam dados.
Parziphal
3
Os dados do @renocor POST também estão incluídos no paramshash do Rails . Os dados do cookie estão incluídos no sessionhash.
21813 Richard Jones
Esta resposta deixa de fora uma outra fonte de parâmetros: a URL. Veja a resposta de hammar para mais informações.
21913 Richard Jones
1
toasterlovin, parece que você não leu a segunda frase da minha resposta ou olhou para o primeiro exemplo.
David Grayson
1
@AnkitDhingra ... Eu acho que sempre será string, pois os parâmetros HTTP são realmente apenas o par de chave / valor e o Rails (provavelmente o Rack gem) analisa isso em hashes e matrizes de acordo com o valor da chave, mas eu não vi nada desse tipo que informa ao Rails que o valor é um número.
rubyprince
75

Como outros já apontaram, os paramsvalores podem vir da sequência de consultas de uma solicitação GET ou dos dados do formulário de uma solicitação POST, mas também há um terceiro local de origem: O caminho da URL.

Como você deve saber, o Rails usa algo chamado rotas para direcionar solicitações para as ações correspondentes do controlador. Essas rotas podem conter segmentos que são extraídos da URL e inseridos params. Por exemplo, se você tiver uma rota como esta:

match 'products/:id', ...

Em seguida, uma solicitação para um URL como http://example.com/products/42será definida params[:id]como 42.

hammar
fonte
Como você obtém um segundo parâmetro? como / squad / id / membro / id / stuff
weteamsteve
48

Params contém os três grupos de parâmetros a seguir:

  1. Parâmetros fornecidos pelo usuário
    • GET (http://domain.com/url?param1=value1¶m2=value2 definirá parâmetros [: param1] e parâmetros [: param2])
    • POST (por exemplo, JSON, XML será automaticamente analisado e armazenado em parâmetros)
    • Nota: Por padrão, o Rails duplica os parâmetros fornecidos pelo usuário e os armazena nos parâmetros [: user] se no UsersController, pode ser alterado com a configuração wrap_parameters
  2. Parâmetros de roteamento
    • match '/user/:id' no routes.rb irá definir parâmetros [: id]
  3. Parâmetros padrão
    • params[:controller]e params[:action]está sempre disponível e contém o controlador e a ação atuais
thejaz
fonte
1
Você poderia expandir sua Nota User supplied parametersum pouco mais? Por exemplo, um exemplo do hash de parâmetros no UsersController seria útil. Seu exemplo faz parecer que o hash será algo como: {first_name: "mike", user: {first_name: "mike"} ...} Isso está correto?
7stud
1
Não estou vendo isso nos trilhos4. Por exemplo {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"},. Perdoe-me se estiver errado, sou iniciante em trilhos. De acordo com sua nota, devo ver: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} não sei se isso tem a ver com parâmetros fortes no rails4 ou não.
7stud
2
Estou vendo os parâmetros duplicados no Rails 4, mas apenas sob solicitações json POST (usando Angularjs) e não nas próprias postagens HTML do Rails. Este link explica o motivo: stackoverflow.com/questions/10774972/…
Homan
13

Basicamente, os parâmetros são dados especificados pelo usuário para aplicação em trilhos.

Quando você publica um formulário, geralmente o faz com a solicitação POST, em oposição à solicitação GET. Você pode pensar em solicitações normais de rails como solicitações GET, quando você navega no site, se ajudar.

Quando você envia um formulário, o controle é retornado ao aplicativo. Como você obtém os valores que você enviou ao formulário?paramseu mostro.

Sobre o seu código. @vote = Vote.new params[:vote]cria novo voto no banco de dados usando dados de parâmetros [: vote]. Como o usuário enviado do formulário foi nomeado com o nome: vote, todos os dados estão neste campo: hash do voto.

As próximas duas linhas são usadas para obter o item e o usuário do uid enviou ao formulário.

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

localiza o voto mais recente ou inserido pela última vez no banco de dados com as condições item_id = item e user_id = uid.

As próximas linhas levam a última hora da votação e a hora atual.

Smar
fonte
6

No lado do Rails, paramsé um método que retorna um ActionController::Parametersobjeto. Consulte https://stackoverflow.com/a/44070358/5462485

Margotte
fonte
3
+1 para esclarecer que paramsé um método. Ruby pode torná-lo difícil distinguir variáveis de métodos
samrap