2014-04-21 58 views
0

我是Rails的新手,我構建了一個quizz應用程序。 我有一個has_many和belongs_to兩個模型之間建立關聯:級別和問題。rails find_by:添加參考鍵作爲參數獲取第一個項目

#models/level.rb 
class Level < ActiveRecord::Base 
    has_many :questions 
end 

#models/question.rb 
class Question < ActiveRecord::Base 
    belongs_to :level 
    attr_accessible :level_id 

end 

我在我的LevelController中有一個動作'startlevel',它只是列出了所有的級別。

class LevelsController < ApplicationController 

    def startlevel 
    @levels = Level.all 
    end 

和帶有鏈接的視圖轉到關卡的第一個問題。我想在鏈接中添加關卡的id作爲參數。我注意到了視圖的url中的1。我不知道爲什麼它會出現在那裏,如果它是我的問題的一部分。

#controller/levels/startlevel/1 
<h2>which level would you like to play</h2> 
    <table> 
    <tr> 
     <th>level</th> 
    </tr> 
    <% @levels.each do |level| %> 
    <tr> 
     <td> level <%=level.number %></td> 
     <td><%= link_to '<> play this level', :controller => "questions", :action => "answer",:level_id=> level.id%></td> 
    </tr> 
    <% end %> 
</table> 

當我跟着鏈接,我想要去與在的link_to id參數匹配的level_id第一個問題,所以我試圖做到這一點:

class QuestionsController < ApplicationController 

    def answer 
    @question = Question.find_by_level_id(params[:level_id]) 
    end 

與此鑑於

<p> 
    <b>Question:</b> 
    <%=h @question.word %> 
</p> 
<p> 
    <b>1:</b> 
    <%=h @question.ans1 %> 
</p> 
<p> 
    <b>2:</b> 
    <%=h @question.ans2 %> 
</p> 
<p> 
    <b>3:</b> 
    <%=h @question.ans3 %> 
</p> 
<p> 
    <b>4:</b> 
    <%=h @question.ans4 %> 
</p> 
    <%= form_tag(:action => "check", :id => @question.id) do %> 
<p> 
    <b>the correct answer is number: </b> 
    <%=text_field :ans, params[:ans]%> 
</p> 
<p><%= submit_tag("check")%></P> 
    <% end %> 

遺憾的是,無論我嘗試了,我得到的最後幾個小時是: 爲無未定義的方法`字」:NilClass (單詞是一個問題的屬性)

我想哭。我究竟做錯了什麼?

p.s.我的想法是在'answer'視圖中添加link_to_unless,除非下一個問題是零,否則我想我需要用相同的引用密鑰對問題進行分組?

+0

要嘗試找出錯誤。你知道你的動作是否被稱爲「應答」嗎? 要檢查,你可以硬編碼你的答案行動,如: '@question = Question.find_by_level_id(1)' – roshiro

+0

你檢查過你的路線嗎?你可以發佈你的routes.rb嗎? –

回答

0

它的工作現在,但我不知道這是否是最漂亮的解決方案。視圖/關卡/遊戲是空的,因爲它只重定向到關卡的第一個問題。

class LevelsController < ApplicationController 
    def startlevel 
    @levels = Level.all 
    end 

    def play 
    @level = Level.find(params[:id]) 
    @question = Question.find_by_level_id(params[:id]) 
    redirect_to controller: 'questions', action: 'answer', id: @question.id 
    end 

#views/levels/startlevel 

<h2>Which level would you like to play</h2> 
<table> 
    <tr> 
     <th>level</th> 
    </tr> 
    <% @levels.each do |level| %> 
    <tr> 
     <td> level <%=level.number %></td> 
    <td> 
    <%= link_to '<> Play this level', :action => "play", :id=>level.id %></td> 
    </tr> 
<% end %> 
</table> 

QuestionsController

class QuestionsController < ApplicationController 
    def answer 
     @question= Question.find(params[:id]) 
    end 

編輯:路線:

quizz::Application.routes.draw do 
    resources :questions 
    resources :levels 

    get "home/index" 
    root :to => 'home#index' 

    match ':controller/:action/:id', via: [:get, :post] 
    match ':controller/:action/:id.:format', via: [:get, :post]