Упрощение этого условного утверждения - PullRequest
0 голосов
/ 08 февраля 2011

У меня довольно сложные (для меня) операторы для написания в Rails.Под show.html.erb моего Person.rb, который является профилем пользователя.Каждый post имеет в базе данных столбец status со значениями draft или published.

<% if @posts.blank? %>
  No post.
<% else %>
  <% if @person == current_user %>
    <% @posts.each do |post| %>
      Post title... (where all published and draft posts are shown)
    <% end %>
  <% else %>
    <% @posts.each do |post| %>
      <% if post.status == "published" %>
        Post title (where only published posts are shown, draft posts are hide from other users)
      <% end %>
    <% end %>
  <% end %>
<% end %>

. Вот проблема.Предположим, что у User A есть 1 опубликованный пост и 1 черновик, он работает нормально;но если User B имеет 2 черновика сообщений, по праву никакие сообщения не будут показаны другим пользователям, но я хочу, чтобы он показывал No post, как и первые две строки кода.

Я пытался named_scope в своемPost.rb руководствуется здесь , но когда я подаю заявку. Опубликовал, она просто вернула мне неопределенную ошибку.

Пожалуйста, научите меня, как этого добиться.Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

Я бы сделал следующее:

Создать область для статуса в сообщениях.

class Post
  named_scope :by_status, lambda { |status| {:conditions => {:status => status} } }
end

Переместите некоторую логику в свой контроллер:

class PostsController
  def index
    @person = Person.find(params[:person_id])
    if current_user == @person
      @posts = @person.posts
    else
      @posts = @person.posts.by_status('published')
    end
  end
end

Напишите ваш взгляд:

<% if @posts.empty? %>
  No posts code
<% else %>
  &lt% @posts.each do |post| %>
    Post title...
  <% end %>
<% end %>

Это решение должно высушить ваш код и добавить больше логики в вашу модель.

0 голосов
/ 08 февраля 2011
<% @posts.to_a.each do |post|
     if @person == current_user || post.status == 'published' %>
       ...
  <% end 
   end %>

.to_a сделает [] из nil, поэтому он может просто уменьшиться до этого ...

0 голосов
/ 08 февраля 2011

Чтобы решить вашу проблему как можно быстрее, я бы просто исключил черновые записи в первой строке, например:

if (@person == current_user) ? @posts.blank? : @posts.select({ |x| x.status == 'published' }).blank?

Но это не очень упрощает вашу общую работу.Это довольно распространенная проблема во взглядах (условно делать одну вещь на основе двух разнородных условий), и, надеюсь, кто-то умнее сможет найти лучшее решение.А пока предлагаю вам это.

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