在Rails 4中为新条目添加位置

时间:2014-07-31 16:30:01

标签: ruby-on-rails ruby controller

我是Ruby on Rails的新手,想要做以下事情:

我有一个用户故事列表,按位置使用jQuery sortable排序。这一切都很好。问题是,当我创建一个新的userstory时,position设置为nil。我想要做的是在列表的按钮中添加一个新的用户故事。如果有以下几点:

  1. 找到位置编号最高的用户素材,
  2. 定位新用户故事=位置最后一个+ 1
  3. 我的控制器看起来像这样:

    def create
    @userstory = Userstory.new(userstory_params)
      respond_to do |format|
        if @userstory.save
          format.html { redirect_to userstories_path, notice: 'Userstory was successfully created.' }
        else
          format.html { render :new }
        end
      end
    

    感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

使用maximum方法从数据库中检索position字段的最大值。

before_create模型中添加Userstory回调,如下所示:

class Userstory < ActiveRecord::Base
  before_create :set_position ## Adding callback

  private    

  def set_position
    ## max_position will be set to maximum value of `position` field from userstories table
    ## max_position would be set as "nil" when userstories table is empty
    max_position = Userstory.maximum(:position) 
    self.position = max_position.nil? ? 1 : max_position+1
  end
end

EXTRA POINTER:目前,您的模型名称Userstory不符合 Rails惯例。您应该考虑将其重命名为UserStory和相关文件名user_story.rb,并且不要忘记将表名称设为user_stories

答案 1 :(得分:0)

def create
  @userstory = Userstory.new(userstory_params)
  @userstory.position = Userstory.order("position DESC").first.position + 1
  respond_to do |format|
    if @userstory.save
      format.html { redirect_to userstories_path, notice: 'Userstory was successfully created.' }
    else
      format.html { render :new }
    end
  end
end

以上代码可以解决您的问题。

答案 2 :(得分:0)

您可以向Userstore模型添加回调

class Userstory < ActiveRecord::Base
  before_create :set_position

  private

  def set_position
    self.position = Userstory.any? ? Userstory.last.position : 1
  end
end