我覺得你只是感到困惑什麼勁參數是應該做的 - 爲質量分配它基本上只是白名單參數。
批量分配是當您使用散列中的屬性或散列中的更新實例化新記錄時。您的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 %>
我們可以使用完全相同的形成要創造新的記錄和編輯。
應用程序/視圖/分類/ new.html.erb:
<%= render partial: "form" %>
應用程序/視圖/分類/ 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
來源
2016-02-19 16:43:58
max
您可以在更新時使用它。你能發佈你的完整代碼嗎? –
我更新了帖子(在編輯1)。 – rwehresmann
嘗試創建一個腳手架控制器 - 'rails g scaffold category name:string'。我不是說你應該使用它,但它會告訴你軌道處理params的方式。 – max