阅读并做一些RoR教程后,他们说我们应该有一个私有方法来请求一个对象并指出其属性。例如:
def category_params
params.require(:category).permit(:name)
end
当我创建一个新类别(此示例中的数据)时,将在我的create动作中使用:
@category = Category.new(category_params)
但是,当我更新类别时,我不能做,@category = Category.new(category_params)
因为:category
不会在中返回params
。这种情况,我的comentaries看到了这个问题的require(:category)
需要拆下来更新操作的工作。这样可以解决问题,但是以其他方式,当我使用category_params
so创建新类别时,总是会保存一个空对象。
有两个私有方法,on withrequire
和另一个not不是一个好习惯,还是吗?在这种情况下的良好做法是什么?
编辑1(我的更新和编辑操作):
def edit
@category = Category.find(params[:id])
end
def update
@category = Category.find(params[:id])
if @category.update_attributes(category_params)
# TO DO
else
render 'edit'
end
end
我认为您只是对强参数应该做什么感到困惑-它基本上只是将用于质量分配的参数列入白名单。
批量分配是指使用散列中的属性实例化新记录或从散列中更新属性时。update
尽管您通常会使用#update
而不是,但您的操作非常好#update_attibutes
。
做到这一点的明智方法是在控制器中使用私有方法,这样您就不必在更新和创建操作中进行两次完全相同的白名单。
class CategoriesController
before_action :set_category, only: [:show, :edit, :update, :destroy]
def new
@category = Category.new
end
def create
@category = Category.create(category_params)
respond_with(@category)
end
def edit
end
def update
if @category.update(category_params)
# TO DO
else
render 'edit'
end
end
# ...
private
def set_category
@category = Category.find(params[:id])
end
def category_params
params.require(:category).permit(:name, :foo, :bar)
end
end
我们像这样设置表单:
app/views/categories/_form.html.erb
<%= form_for(@category) do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<%= f.submit %>
<% end %>
我们可以使用完全相同的形式来创建新记录和编辑。
app / views / categories / new.html.erb:
<%= render partial: "form" %>
app / views / categories / update.html.erb:
<%= render partial: "form" %>
请注意,在某些情况下,您可能希望允许一项操作具有某些属性,但不允许另一项属性。在这种情况下,您只需创建两个强参数方法:
class CategoriesController
before_action :set_category, only: [:show, :edit, :update, :destroy]
def new
@category = Category.new
end
def create
@category = Category.create(create_params)
respond_with(@category)
end
def edit
end
def update
if @category.update(update_params)
# TO DO
else
render 'edit'
end
end
# ...
private
def set_category
@category = Category.find(params[:id])
end
def create_params
params.require(:category).permit(:name, :foo, :bar)
end
def update_params
params.require(:category).permit(:name)
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句