コントローラの代わりにモデルにDBに影響を及ぼし、動作させるのが難しい機能をオフロードするという概念にはかなり新しくなっています。コントローラ内の他のモデルのメソッドの呼び出し
基本的に私の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'
を、ここで私が持っているものです。
A user adds a stock in 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 %>
Which then triggers the StockController
add_stock
method:
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
The 3rd line in the method is where my problem is, since the
follow_stock
method resides in theUser
model:
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
は、いくつかのいずれかを助けることができます私は実際にどのように私の頭を包んでこのメソッドを呼び出すか、私はそれを試している方法で完全に基盤を離れていますか?
UPDATE
私は周りにいくつかのコードを変更しましたし、今私は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) 'のように' StockController'に 'user = current_user.id'の代わりに –