Отображение has_many через ассоциацию в рельсах - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть небольшое приложение, которое позволяет пользователю отслеживать свои авуары для портфеля, добавляя в него свои собственные подборки акций.Я построил ассоциации так:

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"}

Я не вижу, что делаю неправильно

1 Ответ

0 голосов
/ 27 сентября 2018

не может найти портфолио с "id" =

Исходя из предположения и, посмотрев на этот фрагмент кода portfolio_stocks_path(portfolio)), я полагаю, что вы используете вложенные маршруты для portfolios и stocks.Если так, то это объясняет причину ошибки.

Если вы запустите rake routes, вы увидите

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

Это означает, что к экземпляру Portfolio следует обращаться с params[:portfolio_id], а не с params[:id] в stocks_controller.Тем не менее, вы должны изменить методы new и create следующим образом:

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.stocks.create(stock_params), потому что с настройками ваших ассоциаций portfolio.stock.create(stock_params)будет неверный синтаксис и вызовет исключение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...