2016-02-19 36 views
0

閱讀和做一些RoR教程,他們說我們應該有一個私有方法來請求一個對象並指出它的屬性。例如:請求對象的方法的最佳做法

def category_params 
    params.require(:category).permit(:name) 
    end 

當我創建一個新的類別(本例中的數據),我在創建操作使用方法:

@category = Category.new(category_params) 

但是,當我更新的類別,我不能做@category = Category.new(category_params),因爲:category不返回params。對於這種情況,我在this question的備註中看到,需要將require(:category)移除到更新操作工作中。這解決了問題,但換句話說,當我使用category_params創建新類別時,總是保存一個空對象。

有兩種私人方法,onde與require和其他沒有不是一個好的做法,或者是?這種情況下的良好做法是什麼?

EDIT 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 
+0

您可以在更新時使用它。你能發佈你的完整代碼嗎? –

+0

我更新了帖子(在編輯1)。 – rwehresmann

+0

嘗試創建一個腳手架控制器 - 'rails g scaffold category name:string'。我不是說你應該使用它,但它會告訴你軌道處理params的方式。 – max

回答

2

我覺得你只是感到困惑什麼勁參數是應該做的 - 爲質量分配它基本上只是白名單參數。

批量分配是當您使用散列中的屬性或散列中的更新實例化新記錄時。您的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