Рендеринг частичного, который использует вспомогательные методы для определения представления - PullRequest
1 голос
/ 19 февраля 2020

Что в настоящее время работает:

В моем методе BookingsController # Index у меня есть это

def index
    @user = current_user
    if @user.user_type == 'host'
      @bookings = Booking.where(host_id:@user.id, status: "#{params[:status]}")
    else @user.user_type == 'cleaner'
      @bookings = Booking.where(cleaner_id:@user.id, status: "#{params[:status]}")
    end
  end

Это устанавливает текущего пользователя и определяет, какие @bookings для отображение в зависимости от user_id и params.

В представлениях, в моем файле index.html.erb, я отображаю заказы <%= render @bookings %>, которые я определил в booking#index. У меня есть партиал _booking.html.erb, который обрабатывается ... Внутри партиала _booking.html.erb я могу успешно вернуть детали бронирования, например, например,

<div id='booking-time'><b>Unit Name:</b> <%= booking.unit.name %></div>

вернет имя устройства. он распознает локальную переменную booking и поля, которые к ней относятся.

Я хотел бы выполнить рефакторинг:

Я хочу реорганизовать это и сделать частичный <%= render 'bookings/booking' %> в моем файле index.html.erb. Этот фрагмент будет отображать различные вспомогательные методы, которые каждый из них направляет к различным частям.

В настоящее время мой файл _booking.html.erb содержит несколько условных логик c, которые лучше подходят для помощника ... Я пробовал несколько разных способов выполнения sh, но безрезультатно, обычно из-за неопределенных переменных. Какой элегантный способ выполнить sh это?

Что я пробовал:

Вот метод из моего bookings_helper.rb `file:

  def incoming_to_cleaner_partial_path(bookings)
    return unless booking.status=='pending' && current_user.user_type =='cleaner' && booking.requested_by_id != current_user.id
      'bookings/booking_requests/incoming_to_cleaner'
  end

Я добавил logi c к этим методам, чтобы определить, какие части визуализировать.

в моем измененном файле _booking.html.erb, я вызываю эти методы, я передаю им @bookings параметр переменной экземпляра.

<%= render incoming_to_cleaner_partial_path(@bookings) %>

Я также пробовал это без параметров .. Ни работа ..

наконец, я пытался вызвать метод determine_bookings_to_show внутри вспомогательных методов. Этот метод содержит те же логики c от контроллера ...

def incoming_to_cleaner_partial_path
    determine_bookings_to_show
    return unless booking.status=='pending' && current_user.user_type =='cleaner' && booking.requested_by_id != current_user.id
      'bookings/booking_requests/incoming_to_cleaner'
  end

private

def determine_bookings_to_show
    @user = current_user
    if @user.user_type == 'host'
      @bookings = Booking.where(host_id:@user.id, status: "#{params[:status]}")
    else @user.user_type == 'cleaner'
      @bookings = Booking.where(cleaner_id:@user.id, status: "#{params[:status]}")
    end
  end

Моя главная проблема - у меня проблемы с областью действия с этими частями ...

1 Ответ

1 голос
/ 19 февраля 2020

.. в моем индексе [я хочу] отображать различные партиалы [в зависимости от атрибутов бронирования] ..

Я использовал render(locals:) для этого в прошлом.

# index.html.erb
@bookings.each do |b|
  render_booking(b)
end

# bookings_helper.rb
def render_booking(booking)
  if booking.status == 'pending'
    render partial: 'path/to/bookings/_pending', locals: { booking: booking }
  elsif booking.foobar?
    render partial: 'path/to/bookings/_foobar', locals: { booking: booking }
  else
    # etc.
  end
end

Подобные условия могут усложниться, но до тех пор, я думаю, это целесообразное практическое использование вспомогательного метода.

# bookings/_pending.html.erb
<h1>Pending Booking <%= booking.id %></h1>

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

...