2012-07-24 24 views
0

我是Rails的新手。我希望如果一個人在表單上輸入「entity1」(或下面代碼中名爲ENTITIES的其他實體),表單應顯示其關係。檢查實體是否包含在實體列表中的任務是成功的,我無法理解如何打印名爲RELATION_SHIPS的關係。我想:我在通過Rails中的控制器打印某些數據時遇到了一些問題

#puts EntityList::RELATION_SHIPS[params[:user][:entity_name]] 

但它給我一個錯誤,指出模板丟失或RELATION_SHIPS是無法識別的。我該如何解決這個問題?

#users_controller.rb 

class EntityList 

    ENTITIES = ['entity1','entity2','entity3'] 
    #entity1 = {:name => 'Entity One',:position => 1 :relationships => 'entity2', 'entity4'} 

    RELATION_SHIPS = {:entity1 => "entity2", :entity2 => "entity3"} 
end 

class UsersController < ApplicationController 
    layout 'admin' 
    #require File.expand_path('././myconfig') #=> C:/ruby/require/expand_path/ok.rb loaded 

    def new 
    @user = User.new 
    end 

    def create 
    if EntityList::ENTITIES.include?(params[:user][:entity_name]) 
     flash[:notice] = "The entity you entered is valid!!" 

     redirect_to(:action => "helloworld") 

     #puts EntityList::RELATION_SHIPS[params[:user][:entity_name]] 
    else 
     redirect_to(:action => "SorryPage") 
    end 
    end 
end 

回答

0

redirect方法後,您無法執行任何操作。你必須之前做到這一點...

編輯:添加代碼

def create 
    if EntityList::ENTITIES.include?(params[:user][:entity_name]) 
     flash[:notice] = "The entity you entered is valid!!" 
     puts EntityList::RELATION_SHIPS[params[:user][:entity_name]] 
     redirect_to(:action => "helloworld") 
    else 
     redirect_to(:action => "SorryPage") 
    end 
    end 

創建一個應用程序/視圖/用戶/ helloworld.html.erb並顯示結果在控制檯中。

+0

沒有我評論上述兩行Flash和重定向當我測試#puts EntityList :: RELATION_SHIPS [params [:user] [:entity_name]] – 2012-07-24 12:01:40

+0

如果你有redirect_to,你必須有一個helloworld模板。如果你沒有它,你必須創建一個模板(這裏是:app/views/users/create.html.erb)。 – Dougui 2012-07-24 12:10:04

+0

不正確。 redirect_to不 - 不能 - 導致創建函數返回。 – Iain 2012-07-24 12:28:29

0

正如Dougui說的,重定向方法後你無法做任何事情。另外,如果您嘗試在瀏覽器中打印關係,則必須在「視圖」中打印它。 「放」方法將在命令提示符下打印任何內容。

+0

Downvoting,因爲我不相信你已經捕獲了實際問題。抱歉! – Iain 2012-07-25 05:11:21

0

這裏有一個確定的問題和一個可能的問題。可能的問題是,當你輸入一個字符串puts時,該輸出顯示在終端中,而不是發送到Web瀏覽器的輸出中。如果你想讓輸出顯示在網絡瀏覽器中,你需要以某種方式將它放在視圖中 - 或者通過在控制器中設置@variable,或者在控制器中創建一個helper_method並從視圖中調用它(後者是我的首選選項)。但是,對於調試輸出,在終端(用於rails)或日誌(用於pow,passenger或類似的)上使用puts和輸出是沒有問題的。

確切的問題是,如果你puts nil,我不希望看到任何輸出(除了換行符)。你的RELATION_SHIPS哈希鍵是符號。 params[:user][:entity_name]是一個字符串。在由符號鍵入的散列中查找字符串將返回nil,根據關於puts nil的觀察結果,這將會返回無聊。您可能想讓RELATION_SHIPS成爲無差別訪問的散列,儘管您可能想要調用.to_sym上的值來鎖定它。

+0

非常感謝。我錯過了.to_sym方法。問題解決了! :) – 2012-07-25 05:15:59

+0

沒問題!堆棧溢出有一個功能,您可以標記幫助您「接受」的答案。你應該在我的答案左側看到一個勾號,如果你點擊它,它會讓我開心(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work描述它更詳細)。我從你的評論中看到,你已經看到了DGM良好的答案和建議,所以我不會在那裏指出你的意思。快樂滑軌! – Iain 2012-07-25 05:25:30

1

首先,嘗試使用`Rails.logger.debug'而不是put。至於模板錯誤,它可能來自下一個請求 - 您說要重定向到不同的操作。你有'helloworld'和'Sorrypage'的方法和模板嗎?

至於風格,這整個例子是非常錯誤的。如果你不以滑板風格做事情,你會痛苦。

首先,我將EntityList移動​​到模型中,並添加獲取信息的方法,而不是隻暴露常量。在你的例子中,你在ENTITIES和RELATION_SHIPS之間有冗餘信息(爲什麼是下劃線?)。鐵軌的基本理念是「不要重複自己」。你可以只用一個哈希值,並使用散列方法乾涸這些常量:

class EntityList 

    ENTITIES = {:entity1 => "entity2", :entity2 => "entity3"} 

    def self.valid_entity(e) 
    ENTITIES.has_key?(e) 
    end 

    def self.entity_name(e) 
    ENTITIES[e] 
    end 

end 

,然後使用該控制器:

def create 
    if EntityList.valid_entity(params[:user][:entity_name]) 
     flash[:notice] = "The entity you entered is valid!!" 
     redirect_to(:action => "hello_world") 
    else 
     redirect_to(:action => "sorry_page") 
    end 
    end 

瞭解如何短暫的甜蜜,這使得控制器?注意我改變了行爲 - 它們應該至少是小寫,下劃線,以符合rails慣例,但如果他們轉到REST樣式動作,則更好。

確保您的路線文件已設置爲接受它們,並且您擁有這些操作的方法和模板。

最後,這些參數表明這是帶有用戶對象的表單的一部分......並且通過重定向,您將失去所有表單數據。你將不得不解決這個問題。實際上,整個ENTITY應該是用戶模型中的驗證,然後創建方法可以創建一個新用戶並像標準腳手架一樣保存。

+0

我真的很喜歡你的答案,只是它仍然存在提問者在使用需要符號的字符串時的問題。 – Iain 2012-07-25 05:10:26

+0

是的,首先我有'HelloWorld'和'SorryPage'的模板。正如我所說的,我是Rails的新手,所以我認爲我不太熟悉這些錯綜複雜的東西。關係中的數據是多餘的,但我需要它。我的意思是我想存儲所有在ENTITYLIST中存在的實體的關係。我認爲我需要RELATIONSHIPS hash來存儲關係?現在通過添加to_sym來解決錯誤。將根據慣例修改代碼。 – 2012-07-25 05:23:17

+0

@Iain我錯過了看到符號與字符串的原始問題,但是我的解決方案通過使用符號作爲哈希鍵來隱式修復。 Shubhi Agarwal:有沒有關係的實體?我不知道這些是什麼,但在這個例子中,他們是重複的數據。重複的數據會導致潛在的錯誤。 :) – DGM 2012-07-25 12:27:25

相關問題