Как создавать действия/методы контроллера (лучшие практики/общий язык)

Я довольно новичок в рельсах и программировании в целом. Я чувствую, что довольно хорошо усвоил rails MVC и другие концепции, но мне все еще трудно понять синтаксис того, что входит в действия контроллера. Например, когда вы создаете

def edit

end

Откуда вы знаете, как форматировать содержимое/внутри этого метода.

До сих пор я видел много этого:

def new
  @product = Product.new
end

Если я правильно понимаю, это создает экземпляр модели продукта и помещает его в переменную экземпляра, доступную для «нового» представления в продуктах/представлении.

Но допустим, я хочу отредактировать это. Я склоняюсь к тому, чтобы добавить следующее действие в контроллер:

def edit
  @product = Product.edit
end

Я не уверен, что синтаксис Product.edit верен, но не уверен, как отличить редактирование от обновления. Как узнать, что вызывает мой объект модели при создании переменных экземпляра? Есть ли где-нибудь в Интернете, где я могу узнать об этом? Я пока не нашел ни одного места с хорошим списком команд, с которыми я могу играть.


person user3408293    schedule 24.03.2014    source источник
comment
Создайте приложение с каркасом, которое будет содержать все необходимые действия для приложения. И вы сможете легко изучить CRUD.   -  person Bharat soni    schedule 24.03.2014
comment
Лично мне очень нравится InheritedResources, который значительно сокращает утомительный процесс выполнения скучных стандартных действий снова и снова: github.com /josevalim/inherited_resources   -  person Michael Kohl    schedule 24.03.2014


Ответы (2)


def edit
  @product = Product.edit
end

должно быть

def edit
  @product = Product.find(params[:id])
end

простое объяснение

Действие редактирования (#method) вызывается при вызове e.q localhost:3000/products/1/edit

1 — это идентификатор вашего продукта, который передается вашему контроллеру и может быть доступен с помощью параметров.

когда пользователь нажимает редактировать. Обычно данные отправляются для обновления действия

def update
  @product = Product.find(params[:id])
  @product.update(params[:product].permit(:title, :desc))
end

Хорошо, я знаю, что недостаточно хорошо объясняю. Вам действительно нужно это прочитать

http://guides.rubyonrails.org/

person Yana Agun Siswanto    schedule 24.03.2014

Чтобы что-то отредактировать, сначала вам нужно это иметь (или получить, или создать, и т. д.). В методе new вы просто создаете новый экземпляр Product, в этом нет необходимости, но нужен помощник *form_for*, и в целом хорошая практика, потому что вы можете использовать та же форма для создания и редактирования. Product.new просто создает новый продукт и инициализирует его поля значениями по умолчанию. Product.find ищет продукт (один) в базе данных по id и возвращает его. Итак, для редактирования вам сначала нужно найти свой продукт, затем он будет использоваться для заполнения полей в форме редактирования, а затем в методе update вы обновите его:

def update
  target_product_required
  @product.assign_attributes(product_params)

  if @product.save
    redirect_to @product
  else
    render :edit
  end
end

def target_product_required
  @product ||= Product.find(params[:id])
end

def product_params
  params.require(:product).permit(:title, :description, :price, :available_quantity, :image, :remote_image_url)
end

Это распространенный шаблон: target_product_required возвращает/назначает продукт, основанный на идентификаторе в параметрах, переменной экземпляра, product_params возвращает указанные параметры продукта. Подробнее об этом читайте в http://guides.rubyonrails.org/.

person atomAltera    schedule 24.03.2014