2012-07-17 105 views
0

我第一次玩Ruby on Rails,並啓動了一個應用程序。這裏的快速數據庫定義:REST風格的API Ruby on Rails

Teams 
- id: int 
- name: char[20] 

Answers 
- id: int 
- answer_value: text 

我希望能夠鍵入:「HTTP://本地主機:3000 /團隊/ 1 /答案/紫色」在瀏覽器中 如果團隊1個回答紫色。

我認爲添加以下內容到我的routes.rb文件將允許我這樣做,但它沒有。

resources :teams do 
    resources :answers 
    post 'answer_value', :on => :member 
end 

我可以去看到球隊1的第一個答案爲「HTTP://本地主機:3000 /團隊/ 1 /答案/ 1」,但我不知道如何通過實際設定的值URI。

回答

0

如果我理解正確的話,在你的回答,而不是做Answer.find(params[:id])控制器的表演動作,不要Answer.find_by_answer_value(params[:id])

+0

我想我們正在接近這個答案。我沒有意識到,接受我在原始問題中使用的URL的函數是答案控制器中的show操作。我相信我需要將它改爲Answer.new(params [:id]),但不是Answer.find_by_answer_value。我不想查找以前的答案,我正在嘗試創建另一個答案。現在,我正在運行「未定義的方法'stringify_answers'爲<我在URL上輸入的值>」:String'...我在哪裏可以找到調用new的正確方法? – 2012-07-17 09:56:12

+0

只是爲了澄清,我試圖用URL設置值,而不是查找以前創建的答案 – 2012-07-17 10:09:01

0

如果你想創建一個答案,請至

/團隊/ 1 /回答

與參數:答案=> {:answer_value => '紫色'}

不要追加answer_value的URL,看起來像它的記錄ID。

+0

感謝您的快速響應!有沒有辦法設置Ruby on Rails期望在url上的answer_value而不是記錄ID? – 2012-07-17 09:44:54

+0

當然有。但我確實建議你遵循rails的方式,gem就像inherit_resources,你甚至不需要在控制器中編寫任何代碼。 – Prajna 2012-07-19 11:16:42

0

您需要在模型中搭配to_param方法,儘管存在一些注意事項 - 包括需要使用@Chirantan建議的所有尋找器的Answer.find_by_answer_value(params[:id]),該方法可以做你正在尋找的東西。您可以在Railscast on the subject中找到更多信息或在Rails API中搜索to_param,然後選擇ActiveRecord :: Integration下的條目。

或者,您可以使用像FriendlyId這樣的寶石,它提供了一些更全面的功能和對URL構造的控制。

0

在瀏覽器中鍵入內容不會執行任何操作,無論您將哪些內容放入路由中,它只會執行get操作。 通過get創建某些東西不是RESTful,而且你真的不應該這樣做。也就是說,既然你說你只是在玩軌道遊戲,你可以這樣做:

如果你想得到創建的東西,你必須在路線中設置它。 /團隊/ 1 /答案/紫色

get '/teams/:team_id/answers/:answer_value' => 'answers#create' 

然後在你的答案控制器,創建行動,你可以只檢查一個PARAMS [:TEAM_ID],而params [:答案值],並確保被之前的設置保存。

def create 
    @answer = Answer.new() 
    @answer.team_id=params[:team_id] 
    @answer.answer_value=params[:answer_value] 


    respond_to do |format| 
    if @answer.save 
     format.html { redirect_to @answer, notice: 'Answer was successfully created.' } 
     format.json { render json: @answer, status: :created, location: @answer } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @answer.errors, status: :unprocessable_entity } 
    end 
    end 
end