Вызвать метод модели в части, вызванной из другой модели - PullRequest
0 голосов
/ 28 июня 2011

У меня проблемы с вызовом метода в частичном. Метод определен в модели Isbn. Вот установка:

Контракты

has_many :isbns, :through => :istcs

ISBNs

belong_to :contracts

Представление Isbn show успешно отображает результат roy_first, переменной экземпляра, определенной в методе:

<% @isbn.roy_first.each do |hash| %>
<% hash.each do |channel, roy| %>
<%= "#{channel} 1st: £#{roy}" %> 
<% end %><% end %>

Как я уже сказал, roy_first - это переменная экземпляра, определенная в Isbn.rb:

def sales_lookup_complete
# a bunch of code... 
@roy_first << {channel_name => ra = df*(u/100)}
end 

Вот шоу isbns_controller, если оно актуально:

 @isbn.sales_lookup_complete

Но когда я пытаюсь вызвать одну и ту же переменную экземпляра в части _isbn, я получаю неопределенную ошибку метода. Я получаю эту ошибку, когда использую локальную переменную или переменную экземпляра.

Мой вопрос: как я могу назвать то же самое в частичном, к которому обращаются из контрактов> show.html.erb?

Частичное вызывается со страницы шоу контрактов, например:

<%= render @isbns %>

Большое спасибо заранее.

Вот еще какой-то код по запросу:

Метод показа контроллера контрактов:

  def show
    @title = (@contract.contract_name + "'s contract")
    @istcs = @contract.istcs.paginate(:page => params[:page])
    @isbns = @contract.isbns.paginate(:page => params[:page])    
  end

Метод показа контроллера isbns:

  def show
    @isbn   = Isbn.find(params[:id])
    @title  = @isbn.descriptivedetail_titledetail_titleelement_titlewithoutprefix
    @sales  = @isbn.sales.paginate(:page => params[:page] || 1)
    @isbn.sales_lookup_complete
  end

Просмотр контракта:

<h4>ISBNs <span class="add"><%= link_to "Create ISBN", new_isbn_path %></span></h4>
<% unless @contract.isbns.empty? %>
<table summary="Contract ISBNs">
<%= render @isbns %>        
    </table>
<% end %>

ISBN Показать представление:

<table> 
    <tr><h5>Royalties for all sales</h5>
        <tr><% @isbn.roy_first.each do |hash| %>
            <td><% hash.each do |channel, roy| %>
                <%= "#{channel} 1st: £#{roy}" %> 
            </td><% end %><% end %>
        </tr>
</table>

Это бит, который вызывает ошибку, в части, называемой _isbn, и которая находится в области представлений isbn, но вызывается из представления представления контрактов:

 Id: <%= isbn.id%>
<tr><% @isbn.roy_first.each do |hash| %>
    <td><% hash.each do |channel, roy| %>
        <%= "#{channel} 1st: £#{roy}" %> 
    </td><% end %><% end %>
</tr>

Бит isbn.id работает нормально. Код в тегах выдает следующую ошибку:

NoMethodError in Contracts#show

Showing /app/views/isbns/_isbn.html.erb where line #6 raised:

undefined method `roy_first' for nil:NilClass

Extracted source (around line #6):

3:  <span class="content"><%= link_to isbn.descriptivedetail_titledetail_titleelement_titlewithoutprefix, edit_isbn_path(isbn.id) %> </span>
4:     <span class="timestamp">
5:      Id: <%= isbn.id%>
6:      <tr><% @isbn.roy_first.each do |hash| %>
7:          <td><% hash.each do |channel, roy| %>
8:              <%= "#{channel} 1st: £#{roy}" %> 
9:          </td><% end %><% end %>

И превращение его в локальную переменную дает:

NoMethodError in Contracts#show

Showing /app/views/isbns/_isbn.html.erb where line #6 raised:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Extracted source (around line #6):

3:  <span class="content"><%= link_to isbn.descriptivedetail_titledetail_titleelement_titlewithoutprefix, edit_isbn_path(isbn.id) %> </span>
4:     <span class="timestamp">
5:      Id: <%= isbn.id%>
6:      <tr><% isbn.roy_first.each do |hash| %>
7:          <td><% hash.each do |channel, roy| %>
8:              <%= "#{channel} 1st: £#{roy}" %> 
9:          </td><% end %><% end %>

Trace of template inclusion: app/views/contracts/show.html.erb

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Я не знаю, пытаетесь ли вы это сделать, но попробуйте это:

contract_controller - показать

def show
  @title = (@contract.contract_name + "'s contract")
  @istcs = @contract.istcs.paginate(:page => params[:page])
  @isbns = @contract.isbns.paginate(:page => params[:page])    
end

контрактов - показать представление

<h4>ISBNs <span class="add"><%= link_to "Create ISBN", new_isbn_path %></span></h4>
<% unless @isbns.empty? %>
  <table summary="Contract ISBNs">
    <% @isbns.each do |isbn| %>
      <% isbn.sales_lookup_complete %>
      <%= render :partial => "isbn", :locals => {:isbn => isbn} %>
    <% end %>       
   </table>
<% end %>

и_isbn.html.erb

<tr>
  <% isbn.roy_first.each do |hash| %>
    <td>
      <% hash.each do |channel, roy| %>
        <%= "#{channel} 1st: £#{roy}" %> 
      <% end %>
    </td>
  <% end %>
</tr>
0 голосов
/ 28 июня 2011

В _isbn.html.erb частичное:

<% isbn.roy_first.each do |hash| %>
  <% hash.each do |channel, roy| %>
    <%= "#{channel} 1st: £#{roy}" %> 
  <% end %>
<% end %>

это определенно должно работать.

The error occurred while evaluating nil.each эта ошибка означает, что метод roy_first возвращает nil вместо ожидаемого hash.

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