2014-09-01 62 views
1

關於此主題的幾個問題,但我找不到解決我的問題。與STI和設計的嵌套表格

我有(使用單個表繼承)有一個稱爲學生(其中包括)子

學生有一類被稱爲車輛的「HAS_ONE協會一個設計模型稱爲用戶。

我的模型建立:

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
end 

class Student < User 
    has_one :vehicle, :dependent => :destroy 
    accepts_nested_attributes_for :vehicle, allow_destroy: true 
end 

class Vehicle < ActiveRecord::Base 
    belongs_to :student 
end 

我想創建具有用戶領域,學生字段,然後車輛領域,即嵌套形式是這樣的:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> 

*** User fields*** 

    <% if @class == "Student" %> 

    *** Student fields*** 

     <% f.fields_for :vehicle do |builder| %> 

      *** Vehicle fields*** 

      <%= f.hidden_field :_destroy %> 
      <%= link_to "remove", '#', class: "remove_fields" %> 

     <% end %> 

     <%= link_to_add_fields "Add vehicle", f, :vehicle %> 

    <% end %> 
<% end %> 

問題是,我得到一個未定義的方法錯誤:在一個用戶對象車輛。這並不令人驚訝,因爲我並沒有將模型中的車輛實際與用戶相關聯。我只是不知道該怎麼做。

我的用戶/註冊控制器具有以下注冊方法:

# GET /users/sign_up 

    def new 
     @class = params[:class] 

     build_resource({}) 
     respond_with self.resource 
    end 

鑑於遺贈是設置爲User類,我覺得這創造型「用戶」的資源並使其通過以我的觀點,然後不能將它與「車輛」聯繫起來。

有什麼方法可以創建所需的關聯或創建類型爲'student'的資源以傳遞給視圖嗎?

回答

1

這可能不是一個答案(如果需要的話,我會刪除),但我會給你我的觀察&想法:

-

創建

你目前使用users#sign_up作爲控制器方法,但是您希望填充Student類?

我不知道如何設計這種性質,但我知道,如果你想正確使用STI,你會最好直接使用本地對象。例如,如果你想創建一個學生,你會用最好如下:

#app/controllers/students_controller.rb 
class StudentsController < InheritedResources::Base #-> assuming you wish to use Inherited Resources 

    def new 
     new!(@student.build_vehicle) 
    end 

    private 

    def permitted_params 
     params.permit(:student => :your, :student, :params, vehicle_attributes: [:vehicle, :attributes]) 
    end  
end 

這會給你使用相同形式的能力爲你使用,但它只會顯示student記錄:

#app/views/students/new.html.erb 
<%= form_for resource, as: resource_name do |f| %> 
    <% if resource_class == "Student" %> 
     ... 
    <% end %> 
<% end %> 

這將允許您創建一個新的Student對象(你以前沒有)

我不知道這將與制定工作,但我確實知道,如果你如上所述發送請求,您將成爲一名可以創建一個Student對象,並因此能夠創建您需要的功能

+0

感謝您的回覆Rich。我同意,即使在設計中,你建議的方法也可以工作。我可以創建一個Student對象(和相關的Vehicle對象),但問題是Devise功能不會 – user3711600 2014-09-01 13:23:38

+0

感謝Rich的答覆。我同意你所建議的方法可行,包括設計。但是,這意味着我必須爲User的每個子類創建單獨的控制器和視圖。理想情況下,我會嘗試使用單個控制器和一組視圖(即用戶控制器和視圖)來實現此目的。這將是我認爲非常乾的解決方案。爲了實現這一點,我需要的是能夠通過從用戶控制器的類型學生的設計資源對象到視圖。我不確定這是否可能,但最終這是我的問題。謝謝! – user3711600 2014-09-01 13:32:04