【问题标题】:Associated models without nested routes没有嵌套路由的关联模型
【发布时间】:2013-06-21 15:09:26
【问题描述】:

我有两个模型:

class GarageOwner < ActiveRecord::Base  
  has_many :garages, dependent: :destroy
end

class Garage < ActiveRecord::Base  
  belongs_to :garage_owner
end

如果没有车库所有者,车库永远不应该存在。所以在GaragesControllernew 动作中,我需要相应的车库所有者。我不想使用嵌套路由,所以我没有车库所有者 ID 作为参数。但是那我怎么弄到他呢?

更新说明

车库由第三个模型 (Admin) 创建。所以我无法通过当前用户访问车库所有者。

我使用resources 构建我的路线:

       garage_owners GET    /garage_owners(.:format)          garage_owners#index
                     POST   /garage_owners(.:format)          garage_owners#create
    new_garage_owner GET    /garage_owners/new(.:format)      garage_owners#new
   edit_garage_owner GET    /garage_owners/:id/edit(.:format) garage_owners#edit
        garage_owner GET    /garage_owners/:id(.:format)      garage_owners#show
                     PUT    /garage_owners/:id(.:format)      garage_owners#update
                     DELETE /garage_owners/:id(.:format)      garage_owners#destroy
             garages GET    /garages(.:format)                garages#index
                     POST   /garages(.:format)                garages#create
          new_garage GET    /garages/new(.:format)            garages#new
         edit_garage GET    /garages/:id/edit(.:format)       garages#edit
              garage GET    /garages/:id(.:format)            garages#show
                     PUT    /garages/:id(.:format)            garages#update
                     DELETE /garages/:id(.:format)            garages#destroy

【问题讨论】:

  • 您应该将其作为参数传递。你的路线看起来如何?顺便说一句,您为什么不想使用嵌套路由?
  • 我不想让“garage_owner”出现在我的网址中。我更新了问题。你可以在那里看到路线。
  • garage_owner 从何而来?它不在 URL 中,与关联用户无关,任何人或应用程序如何知道 garage_owner 是哪个?

标签: ruby-on-rails ruby-on-rails-3.2


【解决方案1】:

不使用嵌套路由的解决方案是将garage_owner_id 作为隐藏字段插入到您的新车库表单中。但是,您在您的问题中没有说明新的车库表单是如何知道它应该与哪个garage_owner 关联的,所以我无法给您一个具体的例子。

【讨论】:

  • 这就是问题所在。我不知道表单应该如何知道它:P 我想我必须在自定义路由或嵌套路由之间进行选择,即使它看起来不太好。
  • 我不担心表单应该如何知道它,这可以通过以某种方式传递它来解决。但是ANYTHING怎么知道呢?信息是否存储在正在查看“新车库”表格的人的大脑中? Rails 帮不了你..
【解决方案2】:

也许我没有收到您的问题,但我认为您必须从会话中获取车库所有者(例如登录用户),或者从会话中的值或提交的值中获取某些东西使用用于新操作的表单,在这种情况下,它将是一个参数。

【讨论】:

    【解决方案3】:

    你可以通过几种不同的方式来解决这个问题:

    1. 如果GarageOwer 需要登录,您可以从登录时存储的cookie 中获取GarageOwer 用户的ID。

    2. 创建一个自定义路由match "/Garages/new/:owner_id" =&gt; "garages#new",然后在您的控制器中通过params[:owner_id] 访问所有者的ID。

    3. owner_id 添加为“garages/new”页面上表单的隐藏属性。

    【讨论】:

    【解决方案4】:

    我找到了一个合适的解决方案,我认为它仍然很安静。我刚刚为车库创建了多条路线:

    resources :garage_owners do
      resources :garages, except: :index
    end
    
    resources :garages, only: [:index, :show]
    

    普通用户不应访问其他操作。

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2014-08-26
      • 1970-01-01
      相关资源
      最近更新 更多