2

我正在开发一个包含多个部分和开发人员的项目。我们使用 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)

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

4

1 回答 1

0

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

在深入潜水之前,我可以请您尝试一下吗

link_to 'Show', [:public_models, user]

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

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

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

编辑

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

users_path

但对于 put url (edit) 是

user_path(@user)

所以你可以尝试类似的东西

:url => (@user.new_record? ? users_path : user_path(@user))

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

于 2012-07-04T18:26:46.580 回答