将数据从表单发布到不同的控制器并重定向回

时间:2013-01-17 12:35:03

标签: ruby-on-rails ruby-on-rails-3

我正在尝试构建一个表单,将数据发布到另一个控制器/操作,然后重定向回另一个页面。

我的模板格式为:

<%= form_for @url, :url => { :controller => "url", :action => "create" }, :html => {:method => :post} do |f| %>
    <%= f.text_field :url, :placeholder => "http://" %>
   <%= f.submit "Kürzen", :class => "btn" %>
<% end %>

我的url_controller:

class UrlController < ApplicationController
  def create
    redirect_to shorturl_path
  end
end

我的路线:

Ssurl::Application.routes.draw do
  get 'shorturl' => 'landingpage#shorturl', :as => :shorturl
  post '/url/create' => 'url#create'
  root :to => 'landingpage#index', :as => :landingpage
end

当我提交表单时,页面使用表单的get参数重新加载? 所以有2个错误:

  1. 表单使用get而不是post?
  2. 重定向不起作用
  3. 怎么了?

2 个答案:

答案 0 :(得分:4)

看起来您正试图通过指定控制器和操作在form_for中生成一个URL,但是您没有在routes.rb中映射此路由。

所以你有两个选择。第一种是对form_for中的网址进行“硬编码”,如下所示:

<%= form_for @url, :url => "/url/create", :html => {:method => :post} do |f| %>

但更好的解决方案是让您的路线成为RESTful形状。

你可以这样做:

Ssurl::Application.routes.draw do
  get 'shorturl' => 'landingpage#shorturl', :as => :shorturl
  resource :url, :only => [:create]
  root :to => 'landingpage#index', :as => :landingpage
end

使用POST http方法创建RESTful创建路由。因此,您的form_for将如下所示:

<%= form_for @url do |f| %>

更干净!

答案 1 :(得分:1)

用户url_for访问不同控制器的操作 -

form_for @url, :url => url_for(:controller => 'url', :action => 'create')

有关重定向问题 -

控制器并不意味着彼此通信。如果您想在创建网址后执行某些操作,请将其设为模型上的方法并从UrlController中调用它。你甚至可以在模型中添加一个after_save回调,但要注意回调会导致混乱,特别是如果它们很复杂的话。

仔细考虑哪个方法取决于哪个对象。它属于哪里?控制器应该相当直接:获取资源并显示它(用于GET请求),或执行一个操作并重定向回GET页面。如果您想要做的事情也不属于模型,请创建服务类或不同的模型。