Rails 5 — как написать помощник представления

Я пытаюсь научиться использовать помощников в моем приложении Rails 5.

У меня есть модель org_requests, в которой есть атрибуты для хранения даты выполнения различных шагов. Я пытаюсь использовать контроллер для обновления этих атрибутов при сохранении соответствующего действия контроллера.

Например, у меня есть атрибут с именем :approved_at. В моем контроллере у меня есть действие, одобренное с помощью:

def approved
    @org_request = current_user.organisation.org_requests.find(params[:id])

    if @org_request.state_machine.transition_to!(:approved)
      @org_request.update_attribute(approved_at: Time.zone.now)
      flash[:notice] = "You've added this member."
      redirect_to org_requests_path
    else
      flash[:error] = "You're not able to manage this organisation's members"
      redirect_to :index
    end
  end

Я думаю, что эта строка:

 @org_request.update_attribute(approved_at: Time.zone.now)

следует экономить время сейчас, когда одобренное действие сохраняется.

На мой взгляд, я пытаюсь отобразить время, когда были предприняты соответствующие действия. Для этого я пытаюсь написать:

<% @org_requests.each do |org_req| %>
<%= text_for_time_of_status_change(org_req.current_state) %>         

Затем у меня есть помощник, который имеет:

def text_for_time_of_status_change(current_state)
        case current_state
          when 'requested'
            org_request.requested_at.try(:strftime, ' %l:%M  %e %B %Y')
          when 'approved'
            org_request.approved_at.try(:strftime, ' %l:%M  %e %B %Y')
          when 'rejected'
                org_request.rejected_at.try(:strftime, ' %l:%M  %e %B %Y')
          when 'removed'
            org_request.removed_at.try(:strftime, ' %l:%M  %e %B %Y')
        end
    end

Я не могу дать своему помощнику такой org_request (потому что он не примет '.'):

def text_for_time_of_status_change(org_request.current_state)

Это неправильно. Я даже не уверен, нужно ли мне использовать «@» перед org_request (хотя я получаю сообщение об ошибке, когда пытаюсь это сделать).

Может ли кто-нибудь увидеть, что мне нужно сделать, чтобы использовать помощник представления?

Эти статьи: http://6ftdan.com/allyourdev/2015/01/28/rails-helper-methods/, кажется, предполагает, что помощники не предназначены для использования в логике представления. Возможно, они предназначены для каких-то других типов действий. Я не уверен, что даже пытаюсь использовать помощника по назначению.


person Mel    schedule 22.11.2016    source источник
comment
в чем ошибка, которую вы получаете?   -  person sa77    schedule 22.11.2016
comment
что вы имеете в виду, что я не могу дать своему помощнику такой org_request (потому что он не примет '.')?   -  person Oleg Sobchuk    schedule 22.11.2016


Ответы (2)


Вы должны обновить метод text_for_time_of_status_change и передать org_req вместо org_req.current_state. Вы получаете сообщение об ошибке, потому что хотите получить доступ к переменной org_request, но не передали ее вспомогательному методу. После этого изменения не забудьте обновить код вспомогательного метода, чтобы вы вызывали org_request.current_state вместо current_state в case

person Paweł Dąbrowski    schedule 22.11.2016

вам нужно исправить свой helper и в вашем случае лучше использовать частичное:

помощник:

def text_for_time_of_status_change(org_request)
  case org_request.current_state
  when 'requested'
    org_request.requested_at.try(:strftime, ' %l:%M  %e %B %Y')
  when 'approved'
    org_request.approved_at.try(:strftime, ' %l:%M  %e %B %Y')
  when 'rejected'
    org_request.rejected_at.try(:strftime, ' %l:%M  %e %B %Y')
  when 'removed'
    org_request.removed_at.try(:strftime, ' %l:%M  %e %B %Y')
  end
end

чем создать частичное:

_requested.html.erb

<%= text_for_time_of_status_change(org_request) %>

чем в представлении использовать коллекцию частично:

<%= render partial: 'requested', collection: @org_requests, as: org_request %>
person Oleg Sobchuk    schedule 22.11.2016
comment
Большое спасибо. Почему лучше использовать партиал коллекции? - person Mel; 24.11.2016
comment
Частичное кажется более сексуальным, и в этом случае вы избегаете логики в поле зрения (рельсовый путь). - person Oleg Sobchuk; 24.11.2016