Rails 5 - 如何编写视图助手

时间:2016-11-22 06:04:51

标签: ruby-on-rails ruby view-helpers

我正在尝试学习如何在我的Rails 5应用程序中使用帮助程序。

我有一个org_requests模型,它具有保存采取各种步骤的日期的属性。在保存相关控制器操作时,我尝试使用控制器更新这些属性。

例如,我有一个名为:approved_at的属性。在我的控制器中,我有一个名为approved的行动:

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(因为它不会接受&#39;。&#39;):

def text_for_time_of_status_change(org_request.current_state)

这不对。我甚至不确定我是否需要使用&#39; @&#39;在org_request之前(虽然我在尝试时遇到错误)。

任何人都可以看到我需要做什么才能使用视图助手吗?

这些文章:http://6ftdan.com/allyourdev/2015/01/28/rails-helper-methods/似乎暗示帮助者并不打算用于表示逻辑。也许他们意味着其他一些类型的行动。我不确定我是否正在尝试使用帮手以达到正确的目的。

2 个答案:

答案 0 :(得分:1)

您必须更新text_for_time_of_status_change方法并传递org_req而不是org_req.current_state。您收到错误是因为您想访问org_request变量但未将其传递给辅助方法。完成此更改后,请不要忘记更新帮助方法代码,以便在org_request.current_state

中调用current_state而不是case

答案 1 :(得分:0)

你必须修复你的setTimeout(),最好在你的情况下使用partial:

助手:

setTimeout

而不是创建部分:

_requested.html.erb

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