2013-12-11 48 views
1

我有以下情況:在text_area中輸入has_many

一個訂單有很多頁面。我想讓用戶粘貼一些(20多個)URL(這是一個頁面屬性),他們可能在一個doc文件中有一個文本區域。

現在我不使用與Order對象關聯的表單,因爲如果這些URL位於文本區域內,我無法看到如何執行嵌套形式的URL。

我已經看到類似的問題已經在這裏問:Rails: Using a Textarea for :has_many relationship,但我沒有看到如何編碼的視圖和模型,以便這樣做。

所以,如果我有這樣的:

訂購的has_many頁

而且形式是這樣的:

<%= form_for @order do |f| %> 
    <%= f.text_area :page_urls?? %> # This would let the user paste X URLs, which would be 
            # used to create X Pages associated with the Order. 
<% end %> 
+0

要粘貼的20多個網址只能創建一個網頁或20個網頁?應該創建的頁面/頁面是否屬於訂單? – Gjaldon

+0

20個URL會創建20個與該訂單相關的頁面。 –

回答

1

你可以保留你有視圖代碼:

<%= form_for @order do |f| %> 
    <%= f.text_area :page_urls %> 
    #other field and submit button 
<% end %> 

在你的模型,你需要做到以下幾點:

attr_accessor :page_urls 

after_validation do 
    if page_urls 
    parse_page_urls.each do |url| 
     pages.create(url: url) 
    end 
    end 
end 

def parse_page_urls 
    #use regexp to extract urls from page_urls string and return an array of url strings 
end 

的訪問被定義,這樣就可以使用:你的form_builder中的page_urls。你也可以在你的模型中爲page_urls設置簡單的驗證。

訂單經過驗證後,它將根據從page_urls屬性中提取的url數目創建頁面對象。

你可以參考this來獲得一些使用regexp從字符串中提取url的幫助。

希望有幫助!

+0

如果pages.create(url:url)失敗,我將如何捕獲錯誤?我無法看到我將如何添加驗證。另外,爲什麼你這樣做after_validate? –

+0

它應該是'after_validation',對此抱歉。無論如何,我將代碼放入after_validation中,以便它只在訂單有效時才創建頁面。您可以在訂單模型中爲:page_urls屬性添加驗證。如果您的頁面模型將具有更多屬性並且您希望在那裏進行驗證,那麼可以將page_creation行爲置於訂單模型中的before_validation中。只需要一個條件來檢查所有新頁面是否有效。如果所有頁面都有效,則返回false,否則創建所有頁面。不過,這可能會更復雜一些。 – Gjaldon

0

這是nested form最好的處理工作。它會讓你從父模型提交一個has_many關係模型的屬性,就像你希望的那樣。例如,從它的文檔:

想象一下你有一個項目模型has_many:tasks。爲了能夠使用這個寶石,你需要添加accepts_nested_attributes_for :tasksProject模型。如果您希望允許嵌套對象被銷燬,請將:allow_destroy => true選項添加到該聲明中。有關所有可用選項的詳細信息,請參閱accepts_nested_attributes_for文檔。

這將創建一個tasks_attributes=方法,因此您可能需要將其添加到attr_accessible陣列(attr_accessible :tasks_attributes)。

然後使用nested_form_for幫助器方法啓用嵌套。

<%= nested_form_for @project do |f| %> 

然後,您將可以組合使用link_to_addlink_to_remove輔助方法在表單生成與fields_for動態添加/刪除嵌套的記錄。

<%= f.fields_for :tasks do |task_form| %> 
    <%= task_form.text_field :name %> 
    <%= task_form.link_to_remove "Remove this task" %> 
<% end %> 
<%= f.link_to_add "Add a task", :tasks %> 

在回答您的評論:

爲了做這樣的事情,你需要做的控制器處理分離出的URL,然後進行與@order對象關聯的新Page對象。不幸的是,沒有後處理的方法,除非你在客戶端使用隱藏的輸入來處理JS。

+0

我知道如何嵌套窗體的作品。問題是我想在text_area中擁有has_many的屬性。 –