Вызов метода, связанного с частичными рельсами

В моем контроллере у меня есть этот метод, который возвращает мне список конкретных книг controller/books_controller

  def postings
    @books = Book.postings(current_user.id).order("created_at ASC")
    render :partial =>'postings'
  end

У меня есть партиал в views/books/_postings.html.erb

<div class="container">
<h4>My Partial Postings</h4>
 <% @books.each do |book| %>
      <div class="row">
        <div class="col-sm-2"><img src="<%= book.image_path %>" alt="..." class="img-responsive"/></div>
        <div class="col-sm-10">
          <h4 class="nomargin"><%= book.title %></h4>
          <p><%= book.description %></p>
          <p>Quantity: <%= book.quantity %></p>
          <p>Available for: <%= book.sale_type %></p>
     </div>
     </div>
     <hr>
 <% end %>
</div>

В моих маршрутах:

 resources :books do
    collection do
      get 'postings'
    end
  end

на бегущих рейк-маршрутах:

 postings_books GET  /books/postings(.:format)  books#postings

Когда я использую localhost:3000/books/postings, я получаю желаемый частичный список книг. Но когда я хочу вызвать этот частичный список из другого представления, например, из localhost:3000/dashboard/index:

<div class="tab-pane" id="postings">
                    <%= render  'books/postings', :collection => @books %>
</div>

Я получаю следующую ошибку:

 Showing /home/swati/867/WorkSpace2/assignment_3/app/views/books/_postings.html.erb where line #4 raised:

undefined method `each' for nil:NilClass

Extracted source (around line #4):
<div class="container">
<h4>My Partial Postings</h4>
 <% @books.each do |book| %>
      <div class="row">
        <div class="col-sm-2"><img src="<%= book.image_path %>" alt="..." class="img-responsive"/></div>
        <div class="col-sm-10">

Я понимаю, что render просто рендерит партиал без вызова моих методов в books_controller, и мой партиал не имеет доступа к @books , что равно нулю. Как можно к этому подойти?


person swati saoji    schedule 29.11.2015    source источник


Ответы (1)


Когда вы обращаетесь к dashboard/index, вы фактически вызываете index метод dashboards_controller. Если вы хотите отобразить там партиал books/postings, вам также нужно добавить список книг (@books) в этот контроллер.

Подробнее здесь: http://guides.rubyonrails.org/action_controller_overview.html

person sqbell    schedule 29.11.2015
comment
Спасибо, да, я понял это, я фактически переместил сообщения о методах из books_controller в dashboard_controller. Я все еще пытаюсь понять MVC. но я только что где-то прочитал, что контроллер должен быть связан с представлением. Поэтому, если бы я хотел получить доступ к методу публикаций из представлений панели инструментов, было бы лучше использовать этот метод в панели управления_контроллера вместо книг_контроллера. Я не уверен, что то, что я сделал, было идеальным, но оно работает хорошо. - person swati saoji; 29.11.2015
comment
Также просто добавить точку для начинающих пользователей рельсов, таких как я :), если вы не хотите получить доступ к методу в представлениях, вам нужно использовать helper_method.. так что в моем контроллере у меня есть helper_method: postings, и, на мой взгляд, я могу вызвать метод. - person swati saoji; 29.11.2015