使用控制器的Rails 4关注DRY更新方法

时间:2015-03-04 03:48:07

标签: ruby-on-rails ruby-on-rails-4

我有一个rails应用程序,其中许多模型可以使用best_in_place进行编辑,所以我有很多看起来像这样的控制器:

before_action :find_objects, except: [:new, :create]

def update
  @object.update_attributes(object_params)
  respond_to do |format|
    format.json { respond_with_bip @object}
  end
end

private

def object_params
  params.require(:object).permit(:foo, :bar)
end

def find_objects
  @object = Object.find(params[:id])
end

如果要更新的对象将在params散列中使用特定名称,并且object_params和find_objects应根据模型名称调用其正确的版本,如何将此特定重复的部分移动到控制器问题中?是否有一些优雅的元魔法可以解决这个问题?

1 个答案:

答案 0 :(得分:3)

我认为这是一个案例,你的代码可能太干了"。你当然可以使用meta-magic来实现这一点,但从长远来看,它可能会使你的代码混乱。

如果你想进行元魔术,一个技巧就是使用params[:controller]来获取模型的名称。例如,如果您有PostsController,那么:

params[:controller] # => "posts"
params[:controller].classify # => "Post"

更进一步,您可以像这样写一个通用的find_object

def find_object
  model_class = params[:controller].classify.constantize
  model_instance = model_class.find(params[:id])
  instance_variable_set("@#{model_class.name.underscore}", model_instance)
end

但正如我在开始时所说的那样,我不确定为了干掉你的控制器代码我会推荐这么多的抽象。