Gerei um controller, como eu faço o form da view?

11 respostas
P

Eu estive tentando fazer um teste
Criei um controller chamado Teste com um metodo chamado teste
como eu faço um formulário pra enviar alguma coisa pra essa action e me devolver na mesma action o que eu escrevi?
Obrigado.

11 Respostas

d34d_d3v1l

qual framework ta usndo?

P

Eu estou usando Rails 3.2.8
Reformulando o que eu preciso

Eu gerei o comando

rails g controller Test test

Agora eu tenho um controller e uma view
O que eu preciso fazer pra entender direito o funcionamento entre o V e o C do MVC.
Eu quero criar um formulário com 2 inputs. Um para digitar um texto(por exemplo ?I like rails?) e um botão submit.
quero enviar para a action test e devolver para a mesma view uma notícia contendo o que tinha escrito.
Já procurei na documentação, no guia e nada.
Obrigado! :slight_smile:

editando:
parece que eu tenho que arrumar rotas. No java não tem essa frescura, eu não to entendendo nada de como configurar esse routes.rb
O ruby não foi feito pra evitar configuração? essa é a parte ruim. Quem sabe se eu entender essa conversa do V do MVC com o C eu consiga gostar mais um pouco.

Luizao

Vê se ajuda:

http://guides.rubyonrails.org/routing.html

Vc tá seguindo algum livro/tutorial?

P

Estou estudando com Agile Web Development with Rails 4th Edition. Rails guides.
Já procurei em uma porrada de fórum e não encontrei. A minha dificuldade por causa disso, é pq eu uso Struts2, e tenho que definir onde estão as actions e para onde ela redirecionará quando houver sucesso ou falha por exemplo.
Esse é o meu problema, e percebi que o struts.xml seria o routes.rb do Rails.
Gostaria de saber como eu faço para mapear uma action de um controller e como fazer para manipular o redirecionamento para as outras páginas.
Obrigado.

C

match ‘urlquevcquer’ => ‘nome_do_controller_sem_a_palavra_controller#metodo’

Digamos que voce tenha o PostController com a “Action” index.

assim vc define uma rota…por exemplo match “index” => “post#index”

para redirecionar para outra action.

redirect_to :action => ‘nome_do_metodo’

ricardo.valeriano

Tudo bem @pqnoje? Vamos lá...

Quando você executou o generator do rails, o rails criou um arquivo em app/controllers/test_controller.rb, esse arquivo define uma classe TestController, correto? Além disso, para dar uma facilitada na vida, ele também gerou o arquivo em app/views/test/test.html.erb. Além disso, o arquivo config/routes.rb também foi alterado, foi acrescentada lá uma configuração de rota: get "test/test". Isso é tudo que você precisa para criar o formulário, edite o arquivo app/views/test/test.html.erb e adicione o seguinte:

<form action="/test/test">
  <input type="text" name="valor1" />
  <input type="text" name="valor2" />
  <input type="submit" />
</form>

Se você subir o servidor (rails server) e acessar a url http://localhost:3000/test/test, você verá o formulário. Agora vamos tratar os dados enviados através do formulário. Isso será feito no controller, na action test:

class TestController < ApplicationController
  def test
    @valor1 = params[:valor1]
    @valor2 = params[:valor2]
  end
end

A criação das variáveis de instância @valor1 e @valor2 nesse método serão suficientes para resolver a terceira parte desse problema que é exibir essa informação na mesma tela do formulário, portanto, vamos editar lá o formulário para que esses valores apareçam por lá:

<%= @valor1 %><br />
<%= @valor2 %><br />
<form action="/test/test">
  <input type="text" name="valor1" />
  <input type="text" name="valor2" />
  <input type="submit" />
</form>

O exemplo que você quer fazer é esse. Só queria dar um toque específico aqui: tente não fazer muito paralelo entre o Rails e o struts por exemplo, eu tenho a impressão que isso vai mais atrapalhar que ajudar.

Nesse exemplo específico: o arquivo routes.rb tem a configuração para ensinar ao rails que a url /test/test será atendida pela action test do controller Test. Uma convenção do framework diz que, a visualização de uma action, é definida pelo arquivo encontrado em: app/views/[controller]/[action]. Portanto a view para a action test do controller Test fica em: app/views/test/test.html.erb.

Que acha, deu uma melhorada? Qualquer coisa me fala para tentarmos melhorar esse exemplo, ver se fica mais claro o funcionamento da coisa. =)

P

Boa note!
Muito obrigado Ricardo. Era exatamente isso que eu queria! Você me ajudou muito.
Eu estava fazendo exatamente como você fez, só que o meu formulario eu tava usando a classe ActionView::Helpers::FormHelper. Estava fazendo com o form_for e eu não sabia onde que eu colocava o action e nem sabia definir como fazia para enviar via post ou get.
Enfim, agora deu uma esclarecida, não tinha tentado com o proprio HTML achei que era possivel só com esses Helpers.
Tenho uma dúvida agora. Fiz outro teste. Agora o meu controller ta assim:

class TestController < ApplicationController
  def test
    @valor1 = params[:valor1]
    @valor2 = params[:valor2]
  end
  
  def test2
    @valor3 = params[:valor3]
    @valor4 = params[:valor4]
  end
end
Aí criei uma nova view chamada test2.html.erb. Agora enviando via post:
<%= @valor3 %><br />
<%= @valor4 %><br />
<form action="/test/test2" method="post">
  <input type="text" name="valor3" />
  <input type="text" name="valor4" />
  <input type="submit" />
</form>

meu routes.rb eu tive que mudar também:

post "test/test2"

  get "test/test2"

OBS: se eu não colocar esse get, eu não consigo ver a view, se eu não colocar o post, eu não consigo enviar o formulário via post.
A minha dúvida é a seguinte, qual é o melhor jeito de se configurar o routes.rb?
Outra coisa é, é melhor usar Helpers::FormHelper? tanto para envio de texto como fazer upload de arquivos?
Obrigado! :)

ricardo.valeriano

Tudo bem @pqnoje?

Legal que deu uma clareada por aí. Vamos lá…

O resultado que você está obtendo agora é exatamente o esperado, o get torna uma action acessível para requests com verbo http “GET”, e o post faz o mesmo para requests gerado com “POST”. (para saber quais os verbos/métodos http existentes: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html e http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods).

O Rails tem várias formas para configuração de rotas, vai depender muito do que você precisa, se você usar o método resources, várias rotas serão geradas, veja:

#config/routes.rb resources :anuncios

Gera as seguintes rotas (que você pode conferir em uma aplicação Rails através do comando rake routes):

$ rake routes anuncios GET /anuncios(.:format) anuncios#index POST /anuncios(.:format) anuncios#create new_anuncio GET /anuncios/new(.:format) anuncios#new edit_anuncio GET /anuncios/:id/edit(.:format) anuncios#edit anuncio GET /anuncios/:id(.:format) anuncios#show PUT /anuncios/:id(.:format) anuncios#update DELETE /anuncios/:id(.:format) anuncios#destroy

Perceba que inclusive os métodos PUT e DELETE apareceram por ali. Note também que algumas actions estão acessíveis pela mesma url. O Rails vai decidir qual action disparar de acordo com o método http utilizado. Um exemplo é a url /anuncios que está acessível através de request GET para exibir todos os anúncios e também através do método POST para criar um novo anúncio (para saber mais sobre o REST, RESTful e afins: (http://pt.wikipedia.org/wiki/REST, http://en.wikipedia.org/wiki/Representational_state_transfer, http://www.amazon.com/REST-Practice-Hypermedia-Systems-Architecture/dp/[telefone removido]).

Quanto ao uso do helper form_for: sempre prefira ele. Porque ele tem muita inteligência embutida. Por exemplo, você pode reaproveitar o código html do formulário tanto para criação quanto para edição e, o form_for, de acordo com o parâmetro, é capaz de decidir o método http e a url para a qual o formulário terá que ser enviado. Entre outras coisas (aqui tem um material bem bacana sobre rotas: http://guides.rubyonrails.org/routing.html).

Sei que parece muita coisa (e é mesmo), mas a ideia é que, se você seguir o “caminho das pedras” estabelecido pelo próprio Rails, a maior parte dessa complexidade vai ficar escondida. Por isso acho que é recomendável você pegar um passo a passo e seguir, só prá ter contato com essa primeira parte. Aí acho que depois fica mais simples tentar se focar naquilo que é mais específico (como a questão do routes.rb). Uma fonte que posso indicar é a apostila aberta da Caelum: http://www.caelum.com.br/apostilas/, mas tem várias outras, tem inclusive um tópico aqui no fórum sobre o assunto.

E aí cara, deu uma ajuda? Qualquer coisa só falar!

P

Muito boa essa sua explicação. Inclusive, eu nem sabia da existência do método PUT e DELETE, para mim era só o POST e GET, que da pra fazer a mesma coisa com esses que eu não conhecia.
Enfim, aprendi dei muitas fuçadas e vi muitas possibilidades no Rails. Realmente é um framework que facilita muito na questão de desenvolver com agilidade e qualidade.
Eu tenho uma dúvida com o helper form_for da classe ActionView::Helpers::FormHelper.
Na documentação tem exemplos usando objetos.
Eu consegui fazer o seguinte formulário funcionar:

<form action="/login/create_session" method="post">
  Usuário <input type="text" name="username"/>
  Senha <input type="password" name="password"/>
  <input type="submit" value="Entrar"/>
</form>

Mas quando eu tento usar o form_for, ele direciona para uma action nada a ver com o que eu pedi. Ele direciona para "users/create" de um scaffold que eu criei.

<%if !session[:user_id]%>
      <%= form_for "/login/create_session" do |f| %>
        Usuário<%= f.text_field :username %>
        Senha<%= f.password_field :password %>
        <%= f.submit 'Enviar' %>
      <% end %>
<% else %>
      <a href="/login/destroy_session">Logout</a>
<% end %>

Por que está acontecendo isso? :/

C

o form_for é um helper para models…

creio que vc nao tenha um model de session.

No seu caso o certo seria usar form_tag

ricardo.valeriano

Boa Caio, então @pqnoje, a ideia do form_for é te ajudar a criar forms para um modelo em específico, que seria o clássico:

form_for Session.new por exemplo.

Além disso você pode criar um formulário “genérico” se quiser. Basta invocar o

Nesse caso o parâmetro servirá de chave para o método params quando você precisar resgatar as informações submetidas lá do controller. Dá uma olhadinha no link da documentação que o Caio passou, pode esclarecer bem.

Qualquer dúvida, só gritar por aqui novamente. =)

Criado 12 de setembro de 2012
Ultima resposta 19 de set. de 2012
Respostas 11
Participantes 5