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

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

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

怎么了?

4

2 回答 2

4

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

所以你有两个选择。首先是对 中的 URL 进行“硬编码” 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| %>

干净多了!

于 2013-01-17T12:51:54.360 回答
1

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

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

对于重定向问题 -

控制器并不意味着相互通信。如果你想在创建一个 url 后做一些事情,让它成为模型上的一个方法,并从 UrlController 调用它。您甚至可以向模型添加 after_save 回调,但请注意回调可能会导致混乱,尤其是在它们很复杂的情况下。

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

于 2013-01-17T13:17:40.873 回答