我是非常 Ruby on Rails的新手,来自C ++背景,因此其中一些东西有些令人困惑。如果这个问题听起来有些迟钝,请耐心等待,但我很难过。
说我有一个名为Bet的课程:
class Bet < ActiveRecord::Base
投注表如下:
create_table "bets", :force => true do |t|
t.string "text"
t.boolean "completed", :default => false
t.boolean "won_by_bettor"
t.integer "bet_against"
t.datetime "twitter_tstamp"
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "tweet_id"
end
我正在尝试在.haml文件中检索并显示某些赌注(例如,基于user_id)。我怎么能这样做?
如果我在.haml文件中尝试这样的事情:
#{Bet.find(:所有)}
我得到的东西看起来像这样:
#<Bet:0x2aaefc6c3920>#<Bet:0x2aaefc6be0b0>#<Bet:0x2aaefc6bdfc0>#<Bet:0x2aaefc6bdf20>#<Bet:0x2aaefc6bde80>#<Bet:0x2aaefc6bdde0>#<Bet:0x2aaefc6bdd40>#<Bet:0x2aaefc6bdca0>#<Bet:0x2aaefc6bdc00>#<Bet:0x2aaefc6bd368>#<Bet:0x2aaefc6bd278>#<Bet:0x2aaefc6bd1d8>#<Bet:0x2aaefc6bd0e8>#<Bet:0x2aaefc6bd048>#<Bet:0x2aaefc6bcfa8>
这显然不是我想要显示的内容。
任何帮助都会非常感激。
编辑(基于nathanvda的答案/建议)
我将澄清我想要做的事情:我能够显示用户所做的所有投注;但是,我也试图显示其他人对用户进行的投注。这就是我遇到障碍的地方。
我的逻辑是检查赌注表,其中“bettee”=用户(缺少一个更好的单词,对其进行下注的用户),然后显示这些赌注。因此,我理想地喜欢我的show方法来显示所有的AGAINST(不是 - 因为这已经在工作)投注了用户。
我有一个简单的问题:该方法是否需要被称为“show”?或者它应该被称为“索引”?或者名称是否重要,基于它对应的视图?我目前已将该方法实现为“show”但我仍然收到错误,由于某种原因,我认为视图(show.html.haml)无法“界面”(再次,因为缺乏一个更好的词)与bet_controller.rb。在视图的最后两行(第68和69行,我注释掉了 - pastebin.com/rJWMntL0),当我使用dmarkow建议的时候,我得到一个错误(“我们很抱歉,但出了点问题“)。
答案 0 :(得分:1)
在你的控制器方法中,如果你想根据用户ID找到赌注,你可以这样做:
@bets = Bet.where("user_id = ?", 1)
然后在你看来,这将迭代下注:
- for bet in @bets
= bet.text
-# insert anything else you'd want to output
答案 1 :(得分:1)
从您的评论我可以看到它仍然是非常新的。 Rails是MVC,简而言之,它意味着C = Controller收集所有数据。
您是否使用脚手架来创建bets_controller.rb
?我猜不是,您应该尝试在应用程序的根文件夹中的命令行。做点什么
rails g scaffold Bet text:string completed:boolean won_by_bettor:boolean ...
并添加所有字段。这将创建模型,迁移,控制器和示例视图。 入门时,这是了解一切如何联系在一起的好方法。
然后你会看到在控制器内部检索所有数据(模型),并且视图仅进行渲染。在控制器内部,您可以设置一些实例变量(例如@bets
),然后这些变量将在视图中可用。
因此在控制器中会有一个index
方法,它具有以下代码
def index
@bets = Bet.find(:all)
end
在视图中你只需渲染它们。
所以@dmarkow的答案是完全正确的,但对你来说可能还有点太深。
无论如何:我建议选择一本好书,比如Agile Web Development With Rails,这非常适合入门。
[编辑:查看粘贴后添加]
不确定,但您似乎错过了show
方法。如果我理解正确,在单个投注的show
内,您想列出单个用户的所有投注?实际上,要成为更多REST,那将是用户显示视图,或用户范围的bets-view或标准bets-view。通常的做法是,如果用户访问索引页面,他只能看到自己的项目(在这种情况下为bets
- 而不是所有现有的投注:只有管理员会看到这些投注)。
因此,虽然不像REST那样在投注show-view中显示投注列表,但这绝对是可能的。
此外,我在您的视图中看到,您尝试查找用户的所有赌注:这通常是您将放置在控制器内的代码。您希望将视图中的代码保持在最低限度。
在bets_controller.rb
我想添加
def show
@bets = @user.bets.order("twitter_tstamp DESC")
end
在您的视图中,您将使用@bets.each
代替。对于其他人,我反对使用单个字母w
(这对我没有意义 - 但也许它对你有用);对于bet
,我建议使用b
,但使用Rubymine,您不再有任何借口可以保存您的变量名称:它只会让您的代码在以后很难阅读。
在您展示的视图中哪些不起作用?您在哪一行收到错误?
答案 2 :(得分:0)
当你说Bet.find(:all)
时,你会得到一个迭代器,#{}
会在其内容上调用.to_s
来生成一个字符串。所以,像这样:
"Blah blah #{Bet.find(:all)} mumble"
非常像这样:
"Blah blah " + Bet.find(:all).to_s + " mumble"
所以你得到了一堆内存地址和废话。
请参阅dmarkow的答案以更好地了解您应该做什么,但如果您使用的是Rails 2则需要
@bets = Bet.find(:all, :conditions => [ 'user_id = ?', 1])
as,AFAIK,.where
已添加到Rails 3中。