Частичное Rails для элемента массива, не обрабатывающего данные объекта - PullRequest
0 голосов
/ 27 сентября 2018

следующее представление

<% @packageoffers.each do |packageoffer| %>
  <% if @packageoffers_mss.include?(packageoffer) %>
  <% elsif @availables.include?(packageoffer) %>
    <%= render 'packageoffer', collection: @packageoffers %>

возвращает NameError undefined local variable or method 'packageoffer' при попытке обработать частичную _packageoffer.html.erb в строке, подобной второй, следующей за следующим:

<% item_sale_price = @item_price.sale_price * params[:quantity].to_i %>
<% markup_price = ((item_sale_price + (packageoffer.price * @r * @q)) * (1 + (@user.markup.to_d / 100) ) )  %>

note: @item_price сам по себе является элементом массива section и должен был быть объявлен как переменная экземпляра, чтобы передать его <% @item_price = @allotments.select{ |a| a.section_id == section.id }.first

Таким образом, несмотря на соблюдение документации по рельсам ,Я не могу обработать элемент массива.Где лежит ошибка?

Ответы [ 2 ]

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

Вы неправильно используете рендеринг коллекции.

Ваша строка ...

<%= render 'packageoffer', collection: @packageoffers %>

Рендерит один фрагмент и передает локальную переменную с именем collection со значением @packageoffers.

Строка, которую вы написали, является сокращением для:

<%= render partial: 'packageoffer', locals: { collection: @packageoffers } %>

Если вы хотите отобразить всю коллекцию и предоставить частичное имя, выВы не можете использовать сокращенную визуализацию, вы должны использовать явную версию render partial:...:

<%= render partial: 'packageoffer', collection: @packageoffers %>

При этом кажется, что вы намереваетесь перебирать коллекцию и условно отображать некоторые элементы изЭто.В этом случае вам вообще не следует использовать рендеринг коллекций, вы просто должны использовать <%= render packageoffer %>, чтобы Rails мог визуализировать единственное _packageoffer частичное для каждой записи.

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

Модель называется Packageoffer или PackageOffer?Я думаю, что ваша проблема в том, что Rails пытается вывести имя переменной из имени модели.Можете ли вы попробовать, если есть packge_offer?

Если модель имеет PackageOffer, то вы должны использовать _package_offer в качестве частичного имени, package_offer в качестве имени переменной, а также @package_offers.Чтобы соответствовать соглашениям Rails.

РЕДАКТИРОВАТЬ: если это проблема, вы можете использовать свой код с опцией as: :packageoffer на рендере, чтобы сообщить rails имя для использования

...