簡體   English   中英

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

[英]Rails 4 using controller concern to DRY update methods

我有一個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應根據模型名稱調用其正確的版本,如何將此特定重復的部分移動到控制器問題中? 是否有一些優雅的元魔法可以解決這個問題?

我認為這是一個你的代碼可能“太干”的情況。 你當然可以使用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

但正如我在開頭所說的那樣,我不確定為了干掉你的控制器代碼我會推薦這么多的抽象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM