2016-02-14 3 views
1

У меня есть приложение для рельсов!рельсы разные атрибуты формы по категории

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

Это было бы легко, но я хотел бы показать им разные атрибуты, основанные на выбранной категории. Что-то вроде, если они выбирают категорию книг, тогда у них будут поля, такие как title, author, published_at, но если они выбирают категорию обуви, то они могут заполнить поля size, color и type.

Я видел несколько вопросов о динамических формах, но, насколько я понимаю, мне это не нужно, поскольку поля формы будут предопределены, и пользователи не смогут добавлять дополнительные поля.

Каков хороший подход в этом случае? Должен ли я создавать более разные модели, такие как (shoes, books и т. Д.) Или что-то еще?

ответ

1

Должен ли я создать несколько различных моделей

Нет, я не думаю, что это необходимо.

Что вы будете лучше делать используют ajax для заполнения form на category изменений. Это потребует некоторой конфигурации, но и сделает его наиболее эффективным и обеспечить:

#config/routes.rb 
resources :products do 
    put :new, on: :new #-> url.com/products/new 
end 

#app/controllers/products_controller.rb 
class ProductsController < ApplicationController 
    def new 
    if request.get? 
     @product = Product.new 
     @categories = Category.all 
    elsif request.put? 
     @category = params[:product][:category_id] 
     @attributes = ... 
    end 

    respond_to do |format| 
     format.js 
     format.html 
    end 
    end 
end 

#app/views/products/new.html.erb 
<%= form_for @product do |f| %> 
    <%= f.collection_select :category_id, @categories, :id, :name, {}, { data: { remote: true, url: new_product_path, method: :put }} %> 
    <div class="attributes"></div> 
    <%= f.submit %> 
<% end %> 

#app/views/products/new.js.erb 
$attributes = $(...); // need a way to create form elements from @attributes 
$("form#new_product .attributes").html($attributes); 

Что-то важно отметить, что Railsselect & check элементы позволяют использовать атрибут data-remote, чтобы отправить вызов Аякса ваш контроллер при изменении.

Немногая документация об этом, играя с вышеуказанным кодом, должна заставить его работать.

+0

Ричард, спасибо за быстрый ответ. Не могли бы вы подробнее рассказать о том, как я писал (обувь, книги)? Я не вижу некоторых вещей: как можно определить категорию? (Должен ли я делать как 'category_id: 1' и' category_type: "book"??) Как именно я могу добавить атрибуты к различным категориям (как сохранить в db -> простые атрибуты или сериализованный хеш)? Не могли бы вы обновить свой ответ с помощью 'schema.rb'? –

+0

Ну ... как вы управляете категориями? Вы задали вопрос об изменении формы, а не о том, как вы должны структурировать свой сервер. Я могу обновить ответ, но мне нужно знать, как вы хотите, чтобы он работал - у вас есть отдельная модель «Категория» и т. Д.? –

+0

Sry, мой вопрос непонятен. Он еще не создан. Будет 3-4 категории. Если вы попытаетесь создать «продукт», вы выбираете «категорию» с помощью select_helper, и после его выбора остальная часть формы становится видимой в зависимости от того, что вы выбрали. До сих пор это легко. Меня путают, когда дело касается разных атрибутов, основанных на разных «категориях». Таким образом, категория книг будет иметь титул, а автор attr и обувь будут иметь размер и цвет. Я не знаю, каким оптимальным способом является структура моделей/attr в этом случае. Я думаю, что могу заставить его работать, но будет очень плохой код. –

Смежные вопросы