Вопрос о дизайне книги RailsTutorial.org

Привет, я работал над книгой Майкла Хартла RAILSTUTORIAL, и у меня есть вопрос о том, как он строит страницу показа пользователя.

На странице должны быть перечислены все сообщения, сделанные пользователем.

UsersController

def show
   @user = User.find(params[:id])
   @posts = @user.posts.paginate(:per_page => "10",:page => params[:page])
   @title = @user.name
 end

пользователи/show.html.erb

<table class="profile" summary="Profile information">
  <tr>
<td class="main">
  <h1><%= @user.name %></h1>
  <%= render 'follow_form' if user_signed_in? %>
    <% unless @user.posts.empty? %>
      <table class="posts" summary="User posts">

           <%= render @posts %> # this goes to posts/_post and sends the object as post
                            # that makes the _post view use a local variable correct?
          </table>              # is there a way to do with with an @post variable?
    <%= will_paginate @posts %>
  <% end %>
 </td>
 <td class="sidebar round">
  <%= link_to avatar_for(@user), @user.avatar.url %><br />
  <strong>Name</strong> <%= @user.name %><br />
  <strong>URL</strong>  <%= link_to user_path(@user), user_path(@user) %>
  <strong>Posts</strong> <%= @user.posts.count %>
  <%= render 'shared/stats' %>
</td>   
   </tr>    
 </table>

сообщения/_post.html.erb

<tr>
  <td class="post">
 <span class="title"><strong><%= link_to post.title, post %></strong></span><br />

 <span class="timestamp">
  Posted <%= time_ago_in_words(post.created_at) %> ago. </span>
    <a href="<%= likers_post_path(@post) %>">Likers</a><span id="likers"><br />
</span>

  </td>

  <% if current_user?(post.user)%>
    <td>
      <%= link_to "delete", post, :method => :delete,
                                     :confirm => "You sure?",
                                     :title => post.content %>
    </td>
  <%end%>
</tr>

Мне нужно отобразить частичное представление в пользовательском представлении, которое использует объект сообщения, но оно запрашивает его как @post, и поскольку @post не был определен в действии show пользовательского контроллера, я получаю нулевую ошибку.

Мне кажется странным переходить от пользовательского контроллера к представлению сообщений и использовать локальную переменную, которая, если я правильно понимаю локальные переменные, не может использоваться вне этого представления. Есть ли способ присвоить значение сообщения в этом представлении @post в представлении пользователей?

Спасибо за помощь


person trying_hal9000    schedule 27.04.2011    source источник
comment
Пожалуйста, укажите нам на раздел, где это происходит, чтобы мы могли отлаживать те же вещи, что и вы.   -  person Ryan Bigg    schedule 27.04.2011
comment
Я решил это, используя локальную переменную и передав ее другим представлениям, и когда у меня есть определенная @post, я отправляю ее как локальную. Если у вас есть время отладить что-то еще, я задал здесь новый вопрос о том, как перейти от учебника по рельсам к вложенным маршрутам и сохранить фид нетронутым. stackoverflow.com/questions/5800399 /   -  person trying_hal9000    schedule 27.04.2011
comment
Но на случай, если вы хотите это увидеть, листинг 11.17 в этой главе, ruby.railstutorial. org/chapters/user-microposts#top Этому практически нет объяснения, и я не знаю другого способа сделать это, поэтому я сохранил его с помощью локальной переменной. И должен ли я переключиться на приведенный ниже пример вместо ‹%= render @posts %› и сделать это длинным кодом, потому что это будет быстрее отображать ??   -  person trying_hal9000    schedule 27.04.2011


Ответы (1)


Вам нужно использовать локальную переменную в партиале и назначить ее в хеше locals. Эта строка является ярлыком для итерации по массиву и рендеринга партиала. Я не уверен, работает ли это больше в Rails 3:

<%= render @posts %>

Как бы я это сделал:

<% @posts.each do |post| %>
  <%= render 'posts/post', :post => post %>
<% end %>

Немного более старый способ рендеринга партиалов:

<% @posts.each do |post| %>
  <%= render :partial => 'posts/post', :locals => {:post => post} %>
<% end %>
person Austin Taylor    schedule 27.04.2011
comment
‹%= render @posts %› отлично работает в Rails 3 и делает именно то, что делает ваш второй пример, за исключением того, что рендеринг займет немного больше времени. - person Ryan Bigg; 27.04.2011