2016-02-19 2 views
0

Чтение и выполнение некоторых учебных пособий по RoR говорят, что у нас должен быть частный метод для запроса объекта и указания его свойств. Например:Лучшая практика с методами для запроса объектов

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

Когда я создаю новую категорию (данные в данном примере), я использую в моем создании действия:

@category = Category.new(category_params) 

Но, когда я обновляю категорию, я не могу do @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

Я обновил сообщение (находится в EDIT 1). – rwehresmann

+0

Попробуйте создать контроллер леса - 'rails g scaffold category name: string'. Я не говорю, что вы должны использовать его, но он покажет вам путь рельсов для обработки параметров. – max

ответ

2

Я думаю, вы просто запутался о том, что сильные показатели, как предполагается сделать - его в основном только Whitelisting параметры массового назначения.

Массовое назначение - это когда вы создаете новую запись с атрибутами хэша или обновления из хэша. Ваше действие 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 
Смежные вопросы