奇怪的Rails 4表单错误后的RESTful URL

时间:2014-03-24 17:29:17

标签: ruby-on-rails ruby activerecord ruby-on-rails-4 url-routing

我在名为dashboard的命名空间中有一个RESTful控制器,所以我的URL看起来像这样:

  • /仪表板/构件
  • /仪表板/构件/编辑

当我提交带有验证错误的成员表单时发生了一些奇怪的事情......它显示了错误,就像它想象的那样,但是当它转到PATCH url“/ dashboard / member”时它带有一个“.2 “最后:

  • /dashboard/member.2

“2”是记录的ID。

有趣的是,我做的一切都很正确而且效果很好,这个“.2”是唯一困扰我的东西。

我的控制器

class Dashboard::MembersController < ApplicationController

  load_and_authorize_resource :class => Member
  before_filter :authenticate_member!

  def show
  end

  def edit
    @member ||= current_member
  end

  def update
    @member ||= current_member
    if @member.update_attributes(member_params)
      flash[:success] = "Profile updated"
      redirect_to dashboard_member_path
    else
      render "edit"
    end
  end

  private 

  def member_params
    params.require(:member).permit(:first_name, :last_name, :address, :city, :state, :country, :zipcode, :home_phone, :cell_phone)
  end

end

我的路线

namespace :dashboard do 
  resource :member, only: [:show, :edit, :update]
end

2 个答案:

答案 0 :(得分:2)

如果您打算使用resource :member(而不是resources :member),那么您应该知道它总是在没有引用ID的情况下查找。

以下是如何在没有id的情况下创建路线:

 edit_dashboard_member        GET    /dashboard/member/edit(.:format)                              dashboard/members#edit
             dashboard_member GET    /dashboard/member(.:format)                                   dashboard/members#show
                              PATCH  /dashboard/member(.:format)                                   dashboard/members#update
                              PUT    /dashboard/member(.:format)                                   dashboard/members#update

当您发送PATCH请求时,请确保您没有传递argument。如果你传递一个参数,那么它将被解释为format(like .html, .js etc)。在您的情况下,您传递的参数为2member with an id 2

例如:

对dashboard_member_path(2)的PATCH请求

该路线与PATCH /dashboard/member(.:format) dashboard/members#update

相匹配

2被解释为(.:format),因为没有:id部分。

答案 1 :(得分:0)

我不得不从我的表单中删除@member,所以...我有这个:

<%= form_for(@member, url: dashboard_member_path(@member), html: {method: "patch", class: "form-horizontal"}) do |f| %>

它变成了这个:

<%= form_for(@member, url: dashboard_member_path, html: {method: "patch", class: "form-horizontal"}) do |f| %>

现在,将ID传递给URL。

谢谢你们!