Rails路由范围/命名空间问题

时间:2012-07-04 16:23:54

标签: ruby-on-rails routing namespaces

我正在开发一个包含多个零件和开发人员的项目。我们使用mongodb,因此在模型中声明了db的东西。为了只有一个数据库,尽管项目有几个独立的服务器,我们将模型存储在公共目录和gem中。

这意味着我们有模型名称空间,public_models

要避免像/ public_models / users / ...这样的路由,我已声明了以下路由:

scope :module => "public_models" do
  resources :users
end

这在许多情况下都适用,并且可以产生人们期望的效果。

users     GET    /users(.:format)          public_models/users#index
          POST   /users(.:format)          public_models/users#create
 new_user GET    /users/new(.:format)      public_models/users#new
edit_user GET    /users/:id/edit(.:format) public_models/users#edit
     user GET    /users/:id(.:format)      public_models/users#show
          PUT    /users/:id(.:format)      public_models/users#update
          DELETE /users/:id(.:format)      public_models/users#destroy

但是我必须更改几个链接才能使其正常工作。 index.html.erb

link_to 'Show', user_path(user) instead of link_to 'Show', user

form_for我必须指定网址。如果我指定了问题:

form_for @user, :url => user_path(:id => @user) do |f|

然后更新工作,但不是新的我得到“没有路线匹配[POST]”/ user / 287944764774“ 如果我将其更改为

form_for @user, :url => users_path(@user) do |f|

然后新作品就像魅力一样,但我得到了更新错误

"No route matches [PUT] "/user.287944764774"

更不用说我需要使用的redirect_to:

redirect_to user_path(:id => @user.id)

这一切都非常令人困惑和奇怪!我的意思是它不是第一次有人想要将模型存储在另一个地方。它是否真的必须摧毁所有形式的助手等。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我以前在这个问题上遇到了很多麻烦。难以理解的主要原因是,form_for和帮助者链接在与简单模型一起使用时为我们做了很多工作。

在深入潜水之前,我可以请你试试吗

link_to 'Show', [:public_models, user]

并且,在一个新的虚拟项目中,类似

rails g scaffold 'PublicModels::User' name:string

我不确定这些是否是您问题的确切答案,但我认为他们可以提供一些有关正在发生的事情的线索。

修改

关于表单提交,正如您从路径输出中看到的,post url(new)的路径是

users_path

但是对于put url(编辑)是

user_path(@user)

所以你可以试试像

这样的东西
:url => (@user.new_record? ? users_path : user_path(@user))

或者只是将两个表单分开并处理不同代码块中的url / method参数