2013-12-16 43 views
0

即時通訊對ruby-on-rails很新穎,希望你能幫助我。我正在嘗試使用ruby-on-rails爲Redmine編寫一個插件。而且我在我的控制器中從模型中調用一個新方法時遇到一些問題。所以,我提出Redmine的插件教程事後有這些項目:不能調用控制器中的模型方法

型號:

class Poll < ActiveRecord::Base 
    def vote(answer) 
    increment(answer == 'yes' ? :yes : :no) 
    end 
end 

控制器:

class PollsController < ApplicationController 
    def index 
    @project = Project.find(params[:project_id]) 
    @polls = Poll.all 
    end 

    def vote 
    poll = Poll.find(params[:id]) 
    poll.vote(params[:answer]) 
    if poll.save 
     flash[:notice] = 'Vote saved.' 
    end 
    redirect_to :action => 'index' 
    end 
end 

的index.html:

<h2>Polls</h2> 

<% @polls.each do |poll| %> 
    <p> 
    <%= poll.question %>? 
    <%= link_to 'Yes', { :action => 'vote', :id => poll[:id], :answer => 'yes' }, :method => :post %> (<%= poll.yes %>)/
    <%= link_to 'No', { :action => 'vote', :id => poll[:id], :answer => 'no' }, :method => :post %> (<%= poll.no %>) 
    </p> 
<% end %> 

後來我想將Wikicontent添加到相同的HTML只是爲了習慣使用RoR。所以,我現在的項目看起來像這些:

型號:

class Poll < ActiveRecord::Base 
    def vote(answer) 
    increment(answer == 'yes' ? :yes : :no) 
    end 
    def self.load_content 
     @wiki_content = Poll.find_by_sql ("select wc.text 
           , wc.comments 
           , wc.version 
           from wiki_contents wc 
           where wc.page_id = (select min(id) 
             from wiki_pages 
             where wiki_id = 3") 
    end 
end 

控制器:

class PollsController < ApplicationController 
    def index 
    @project = Project.find(params[:project_id]) 
    @polls = Poll.all 
    @wiki_content = Poll.load_content 
    end 

    def vote 
    poll = Poll.find(params[:id]) 
    poll.vote(params[:answer]) 
    if poll.save 
     flash[:notice] = 'Vote saved.' 
    end 
    redirect_to :action => 'index' 
    end 
end 

的index.html:

<h2>Polls</h2> 

<% @polls.each do |poll| %> 
    <p> 
    <%= poll.question %>? 
    <%= link_to 'Yes', { :action => 'vote', :id => poll[:id], :answer => 'yes' }, :method => :post %> (<%= poll.yes %>)/
    <%= link_to 'No', { :action => 'vote', :id => poll[:id], :answer => 'no' }, :method => :post %> (<%= poll.no %>) 
    </p> 
<% end %> 

<% @content.each do |cn| %> 
    <p> 
     <%= cn.text %> 
    </p> 
<% end %> 

即時得到根據 「內部錯誤」我的瀏覽器。我試圖找到錯誤,似乎我不能從我的模型內控制器調用新方法,我無法弄清楚爲什麼。就像我說的,我對RoR真的很陌生,所以我希望你能幫助我。

這是在日誌文件中的錯誤描述:

ActiveRecord::StatementInvalid (Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7: select wc.text 
           , wc.comments 
           , wc.version 
           from wiki_contents wc 
           where wc.page_id = (select min(id) 
             from wiki_pages 
             where wiki_id = 3): 

問候 附庸風雅

+1

您可以發佈您收到的錯誤嗎? – Doon

+0

「內部錯誤 在您嘗試訪問的頁面上發生錯誤 如果您仍然遇到問題,請聯繫您的Redmine管理員以獲得幫助。 如果您是Redmine管理員,請檢查您的日誌文件以獲取有關錯誤的詳細信息。「 – Arty

+0

我的意思是您的錯誤日誌,而不是您的瀏覽器/ Web服務器顯示的通用5xx錯誤。你試圖在nil上調用一些東西) – Doon

回答

1

在您的index.html中,您使用的是<% @content.each do |cn| %>,但是在您的代碼片段中沒有任何地方可以將任何值分配給@content。既然你是在分配給您的控制器index行動@wiki_content,我假設你想在這裏使用@wiki_content

# app/views/polls/index.html 
... 
<% @wiki_content.each do |cn| %> 
    <p> 
     <%= cn.text %> 
    </p> 
<% end %> 

更新:

由您張貼的錯誤,並在雙看看你的查詢您的查詢中有語法錯誤。您在內部選擇中缺少右括號)。更新您的查詢,如下所示:

# app/model/poll.rb 
def self.load_content 
     @wiki_content = Poll.find_by_sql ("select wc.text 
           , wc.comments 
           , wc.version 
           from wiki_contents wc 
           where wc.page_id = (select min(id) 
             from wiki_pages 
             where wiki_id = 3)") 
end 
+0

是的你是對的。只是自己也看到了,修正了它,但錯誤仍然出現。 – Arty

+0

@Arty,請在發現此錯誤時發佈日誌文件的內容,以便更快地發現問題。請用日誌更新你的問題。 – vee

+0

做到了這一點,並嘗試從工作臺相同的SQL語句,它的工作原理。 – Arty

1

你需要分配一個值的模型方法返回的東西而不是@wiki_content作爲模型沒有該變量的任何可見度

它看起來像那樣

def self.load_content 
     return Poll.find_by_sql ("select wc.text 
           , wc.comments 
           , wc.version 
           from wiki_contents wc 
           where wc.page_id = (select min(id) 
             from wiki_pages 
             where wiki_id = 3") 
    end 
+0

做到了這一點不幸的是,我仍然得到錯誤 – Arty

+2

@胺:最後執行的語句的值將在ruby中自動返回,你不必明確地返回它 – usha

+0

沒錯。部分是放棄'@wiki_content =' – amine