使用模型的回调

使用模型的回调可以避免在控制器中的CRUD方法中写一些逻辑代码。

 

丑陋的

 

<% form_for @post do |f| %>
  <%= f.text_field :content %>
  <%= check_box_tag 'auto_tagging' %>
<% end %>

class PostsController < ApplicationController
  def create
    @post = Post.new(params[:post])

    if params[:auto_tagging] == '1'
      @post.tags = Asia.generate_tags(@post.content)
    else
      @post.tags = ""
    end

    @post.save
  end
end

 

在这个例子中,如果用户点了auto_tagging这个复选框,将会根据文章的内容来生成标签,然后在保存之前把标签赋值给这篇文章,我们可以把标签的赋值代码移到模型中,通过模型的回调来处理。

 

重构

 

class Post < ActiveRecord::Base
  attr_accessor :auto_tagging
  before_save :generate_tagging

  private
  def generate_taggings
    return unless auto_tagging == '1'
    self.tags = Asia.generate_tags(self.content)
  end
end

<% form_for @post do |f| %>
  <%= f.text_field :content %>
  <%= f.check_box :auto_tagging %>
<% end %>

class PostsController < ApplicationController
  def create
    @post = Post.new(params[:post])
    @post.save
  end
end

 

和你看到的一样,我们在Post模型中创建了一个before_save回调方法来生成标签并赋值(如果用户点击了auto_tagging这个复选框),这样在控制器中就不必关心模型的逻辑了。

你可能感兴趣的:(使用)