簡體   English   中英

通過Rails中的關聯顯示has_many

[英]Displaying has_many through association in rails

我有一個小應用程序,通過添加自己的股票選擇權,用戶可以跟蹤投資組合的持有量。 我建立了以下關聯:

stock.rb 
has_many :portfolio_stocks
has_many :portfolios, through: :portfolio_stocks

portfolio.rb 
has_many :portfolio_stocks
has_many :stocks, throough: :portfolio_stocks

portfolio_stocks.rb
belongs_to :stock
belongs_to :portfolio

我在將股票添加到投資組合的新模板中遇到麻煩。 這就是stocks_controller動作

def create
portfolio = Portfolio.find(params[:id])
@stock = portfolio.stock.create(stock_params)
end

# GET /stocks/new
def new
@portfolio = Portfolio.find(params[:id])
@stock = Stock.new
end

和我的new.html.erb模板

<center>
<div class="container">
<div class="card-body">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<%= link_to 'Home', portfolios_path %>
</li>
<li class="breadcrumb-item active">Create</li>
</ol>
<%= render partial: "form", locals: {stock: @stock, portfolio: @portfolio}%>   
</div>
</div>
</center>

呈現_form部分

<%= form_for(stock, url: portfolio_stocks_path(portfolio)) do |f| %>
<% if stock.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(stock.errors.count, "error") %> prohibited this portfolio 
from being saved:</h2>
<ul>
<% stock.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="form-group">
<%= f.text_field :symbol, autofocus: true, class: 'form-control', 
placeholder: "Enter a ticker" %>
</div>

我不斷收到錯誤

找不到帶有“ id” =的投資組合

參數:

{"utf8"=>"✓",
 >"stock"=>{"symbol"=>"FB",
 >"sector"=>"Tech",
 >"high"=>"123",
 >"low"=>"123",
 >"price"=>"123"},
 >"commit"=>"Add Stock",
 >"portfolio_id"=>"1"}

我看不到我在做什么錯

找不到帶有“ id” =的投資組合

遵循假設並查看這段代碼portfolio_stocks_path(portfolio)) ,我相信您正在為portfoliosstocks使用嵌套路由 如果是這樣,那就說明了錯誤的原因。

如果您使用rake routes ,您會看到

portfolio_stocks      POST   /portfolios/:portfolio_id/stocks(.:format)        stocks#create
new_portfolio_stock   GET    /portfolios/:portfolio_id/stocks/new(.:format)    stocks#new

這意味着應該使用stocks_controller中的params[:portfolio_id]而不是params[:id]訪問Portfolio實例。 也就是說,您應該更改newcreate類似的方法

def create
  portfolio = Portfolio.find(params[:portfolio_id])
  @stock = portfolio.stocks.create(stock_params) #fixed the invalid syntax
end

# GET /stocks/new
def new
  @portfolio = Portfolio.find(params[:portfolio_id])
  @stock = Stock.new
end

還要注意,我已經將portfolio.stock.create(stock_params)更改為portfolio.stock.create(stock_params) portfolio.stocks.create(stock_params)因為在您的關聯設置方式中, portfolio.stock.create(stock_params)將是無效的語法,並且將引發異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM