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

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.

qual framework ta usndo?

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.

Vê se ajuda:

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

Vc tá seguindo algum livro/tutorial?

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.

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’

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:

[code]


[/code]

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á:

[code]<%= @valor1 %>

<%= @valor2 %>

[/code]

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. =)

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:

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

def test2
@valor3 = params[:valor3]
@valor4 = params[:valor4]
end
end
[/code]

Aí criei uma nova view chamada test2.html.erb. Agora enviando via post:

[code]<%= @valor3 %>

<%= @valor4 %>

[/code]

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

[code]post “test/test2”

get “test/test2”[/code]

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! :slight_smile:

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/0596805829).

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!

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:

[code]
Usuário
Senha

[/code]

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? :confused:

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

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. =)