2016-08-26 60 views
-1

我正在使用spring security和grails 3.1.10創建一個網站。在這個站點中,我列出了數據庫中的所有圖像,並在索引處顯示它們。問題是當我試圖編輯其中一個圖像時。例如,我只想編輯名稱,但如果我不選擇圖像,則該字段將變爲null。但我想保護圖像。我怎麼能通過這個。如果在編輯頁面上沒有選擇新的Grails會丟失圖像

編輯GSP

<div class="col-xs-2 col-sm-2 col-md-2"> 
<input type="file" class="form-control" name="productImage" id="productImage"> 
</div> 

我試着寫一個控制器來保護老之一,但這個不行。

def id=params.id 
    Product old=Product.findById(params.id) 
    def f = request.getFile('productImage') 
    if(f.empty){ 
     print("file is empty") 
     if(old.productImage){ 
      println("there is a file in database") 
      product.productImage=old.productImage 
     }} 
+2

該代碼並不代表您列出的問題。您正在列出所有圖像,然後在該gsp顯示迭代或編輯功能中編輯任何內容,如何工作 – Vahid

回答

1

我想我有點明白這裏有幾個問題:

//These two are the same 
Long id=params.id ? params.id as Long : null 
Long id=params.id ? params.long('id') : null 

它說

Long id= (is there a params.id) 
    { yes ? } -> params.id as Long {otherwise :} -> null 

findById應在極少數情況下使用:

//You should never use findById unless an example would be findByIdAndSomethingElse(id,somethingElse) 
// Product old=Product.findById(params.id) 

而應該使用(look int讀取和加載)get是最好的,因爲它確保記錄實際存在,並且讀取可以返回一個緩存副本(可能從此被刪除)(讀取負載較少資源密集型)值得關注 - 因此堅持get:你可能沒有ID,因此它應該圍繞進一步

if (id) { 


    // Product old=Product.get(id) 
    // Product old=Product.read(id) 
    // Product old=Product.load(id) 
    // You could have just done this which should convert params.id as long itself as the method 
    Product old=Product.get params.id 

def f = request.getFile('productImage') 
if(f.empty){ 
    print("file is empty") 
    if(old.productImage){ 
     println("there is a file in database") 
     //I think this may be the issue: 
     product.productImage=old.productImage 
     //should this not be ? 
     product=old 
    }} 

現在你已經列出你的聲明,是對我的評論的原因後做什麼舊或產品包裹。

產品或舊產品是否作爲變量發送到gsp頁面它們是如何表示的?

另外,如果這是你的編輯表單;

<div class="col-xs-2 col-sm-2 col-md-2"> 
<input type="file" class="form-control" name="productImage" id="productImage"> 
</div> 

這是缺失值

<input type="file" class="form-control" name="productImage" 
value="${someParams?.value}" id="productImage"> 

幽州返回null所以它必須是你沒有提供,因爲這個領域實際上沒有定義的值一些其他形式的領域,因此永遠不會是空值。

還要注意

值= 「$ {someParams?.value的}」 VS 值= 「$ {} someParams.value」

的?正在保護字段不返回空值。所以在表單開始的時候,可能沒有一個值會將其保存在用戶的屏幕上顯示爲空。

所有這麼說似乎有一個可以在你說的一些事情空VS你想設置什麼等衝突..也許你想要什麼,或者也許一個把它所有

的更簡單的方法的衝突
def f = request.getFile('productImage') 
if (f.empty) { 
    if (params.id) { 
    Product old=Product.get(params.id as Long) 
    print("file is empty") 
    if (old.productImage) { 
     println("there is a file in database") 
     product.productImage=old.productImage 
    } else { 
     //what should produce.productImage be now if no file and nothing on db ? 
    } 
    } else { 
    //what should happen if there is no product.id ? 
    } 


    } else { 
    //what happens when there is a file provided - should that Product check be outside of this loop entirely should that file being returned be merged with the existing record ? 
    } 

這裏有很多可以幫助你理解發生了什麼問題的地方。所有人都說這種東西應該通過驗證類來完成,這樣可以節省你不得不在控制器中編寫大量邏輯的過程,最終看起來太長時間了,而且太麻煩了,很難遵循。

我會稍後更新一個示例項目:https://github.com/vahidhedayati/grails-bean-validation-examples,並帶有圖像示例。希望用視頻來解釋我添加的內容。完成後會在這裏發表評論。

+0

https://github.com/vahidhedayati/grails-bean-validation-examples包含一個非常複雜的圖像bean如https://www.youtube.com/watch?v=ATLQ7CCvPvI所示 – Vahid

相關問題