渲染方法网址与原始网址匹配

时间:2016-11-12 17:02:50

标签: ruby-on-rails

我们说我的表格是:

  

/类别/新

当表单输入无效时,我调用render。经典例子:

  def create
    @category = Category.new(category_params)
    if @category.save
      flash[:success] = 'Category successfully created.'
      redirect_to @category
    else
      render 'new'
    end
  end

我的问题是,为什么调用渲染后的网站路径只是:

  

/类别

而不是:

  

/类别/新

根据我的理解' new'表格应该在同一页面上呈现,这两条路径显然不相同。

正如评论者在此处所建议的还有其他信息:

相关路线:

  resources :categories do
    resources :topics, name_prefix: 'category_',
                       except: [:index, :show, :edit, :update, :destroy]
  end

类别新动作:

  def new
    @category = Category.new
  end

1 个答案:

答案 0 :(得分:0)

不要将网址显示的内容与实际呈现的内容混淆。

简答

当您最初输入表单时,实际上是POST/categories。这当然映射到控制器中的create操作,当验证失败导致新表单呈现时 - 它不会重定向,因此网址不会发生变化 - 网址仍然与之相同当你进入行动时做了。

详细说明

当您调用/categories/new时,您实际上被路由到类别控制器上的new操作。

您的new操作会设置任何实例变量,例如@category,rails会渲染包含新类别表单的new.html.erb。

当您提交表单时,它实际上正在执行http POST/categories,它会路由到您的类别控制器的create操作。 url和http方法是form_for帮助器生成的结果:

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

这就是网址从/categories/new更改为/categories

的原因

现在create操作如果验证失败,则只需渲染新表单 - 它不会重定向到任何地方 - 网址与进入此操作时保持不变 - 这意味着它保持为{{1 }}

不要将网址中的更改与重定向混淆,只是表单发布到与/ categories / new不同的网址,而网址的更改实际上只是一个整容问题。< / p>

现在,如果您担心,可以将路由更改为以下内容:

/categories

这是将POST和GET http方法映射到/ new_category,因此对于new和create action invocations,url显示相同。请注意,您需要更改form_for帮助程序中的URL以使用此新路由:

  resources :categories, except: [:create, :new]

  post     'new_category' => 'categories#create'
  get      'new_category' => 'categories#new'