我有一个控制器根据数字位置对对象的顺序进行排序:
<%= 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
答案 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