【发布时间】:2016-07-14 13:10:01
【问题描述】:
因此,我对将影响数据库的功能卸载到模型而不是控制器的概念非常陌生,并且在使其工作时遇到了一些困难。
基本上,从我的Stock 控制器,我试图在我的User 模型中调用一个方法。相反,我收到了一个错误:
NoMethodError (undefined method `stock_relationships' for #<Class:0x007fc0da1a8d60>):
app/models/user.rb:27:in `follow_stock'
app/controllers/stocks_controller.rb:20:in `add_stock'
所以,这就是我所拥有的:
用户在 views/stocks/index.html.erb 中添加股票
<% @stocks.each do |s| %>
<tr>
<td><%= s.symbol %></td>
<td><%= s.name %></td>
<td>
<%= link_to raw("<i class='fa fa-plus'></i>"), add_stock_path(id: s.id) %>
</td>
</tr>
<% end %>
然后触发 StockController
add_stock方法:
def add_stock
stock = Stock.find(params[:id])
user = current_user.id
User.follow_stock(stock_id: stock, user_id: user)
flash[:success] = "Successfully added stock"
redirect :back
end
方法中的第 3 行是我的问题所在,因为
follow_stock方法位于User模型中:
class User < ActiveRecord::Base
has_many :stock_relationships
has_many :stocks, through: :stock_relationships
def self.follow_stock(stock)
self.stock_relationships.create(stock_id: stock)
end
end
有人可以帮我弄清楚如何实际调用此方法,还是我完全不了解我的尝试方式?
更新
我已经更改了一些代码,现在我可以创建 StockRelationship 但是,stock_id 正在保存为 nil:
=> #<StockRelationship:0x007fee03f25f00
id: 17,
user_id: 1,
stock_id: nil,
created_at: Thu, 14 Jul 2016 13:44:52 UTC +00:00,
updated_at: Thu, 14 Jul 2016 13:44:52 UTC +00:00>
我更改了StockController#add_stock中的代码:
def add_stock
stock = Stock.find(params[:id])
current_user.follow_stock(stock)
flash[:success] = "Successfully added stock"
redirect_to :back
end
【问题讨论】:
-
#stock_relationships是一个实例方法,您在User类上调用它,而不是在User实例上调用它,这就是问题所在。将def self.follow_stock(stock)更改为def follow_stock(stock)。并像user.follow_stock(stock)一样打电话
标签: ruby-on-rails ruby activerecord