根据方法中的条件语句设置before_action

时间:2014-10-03 01:09:30

标签: ruby-on-rails controller conditional-statements

我有一个控制器根据数字位置对对象的顺序进行排序:

<%= form_for @subject do |f| %>
  <p><%= f.label :position %></p>
  <p><%= f.select :position, 1..@subject_count %></p>
<% end %>

如果有人想创建一个新主题,可能会在选择框中添加一个额外的数字位置。因此,例如,如果有5个科目,而有人想要添加另一个科目,那么将有6个职位可供选择。

这是我目前如何设置控制器的方法。

def new
  @subject = Subject.new
  @subject_count = Subject.count + 1
end

def create
  @subject = Subject.new(subject_params)
  @subject_count = Subject.count + 1
end

def edit
  @subject_count = Subject.count
end

def update
  @subject_count = Subject.count
  ...
end

private
  def subject_params
    params.require(:subject).permit(:name, :position, :visible)
  end

  def set_subject
    @subject = Subject.find(params[:id])
    @subject_count = Subject.count
  end

我希望通过使用before_action来保留此代码DRY,该before_action仅在新的Subject.count上添加1并在一个方法中创建操作。有没有办法设置条件,我可以完成这个?这就是我的想法:

  def_set_subject_count
    # if new || create actions are requested
    #   @subject_count = Subject.count + 1
    # elseif edit || update actions are requested
    #   @subject_count = Subject.count
    # end
  end

1 个答案:

答案 0 :(得分:2)

当然,您可以使用action_name获取包含当前操作名称的字符串。所以这样的事情会起作用:

def set_subject_count
  @subject_count = if %w(new create).include?(action_name)
                     Subject.count + 1
                   else
                     Subject.count
                   end
end