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!
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.
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]
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 %>
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 %>
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!
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
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?
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. =)