Теговая модель на другом рельсе - PullRequest
0 голосов
/ 13 января 2019

Я хочу пометить свою модель продукта на моей почтовой модели.

post.rb

 has_many :taggings
 has_many :products, through: :taggings

product.rb

has_many :taggings
has_many :posts, through: :taggings

tagging.rb

belongs_to :post
belongs_to :product

В моем сообщении есть список товаров. Я хочу, чтобы, когда пользователь нажимает на товар, он создает новую ссылку на товар / публикацию с помощью метода публикации.

Какую ссылку я могу использовать? Как настроить контроллеры и параметры?

Спасибо за помощь

1 Ответ

0 голосов
/ 14 января 2019

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

<%= form_for(@post) do |f| %>
  # ...
  <div class="field">
    <%= f.label :product_ids %>
    <%= f.collection_select :product_ids, Product.all, :name, :id %>
  </div>
<% end %>

def post_params
  params.require(:post)
        .permit(:foo, :bar, product_ids: [])
end

Rails автоматически создаст записи в таблице соединений.

Если вы хотите, чтобы пользователь создавал связи по одной, вам нужно настроить вложенный маршрут :

Rails.application.routes.draw do
  # ...
  resources :posts do
    resources :taggings, only: :create
  end
end

Затем вам нужно настроить форму для каждого продукта на странице posts/show.html.erb:

<ul>
  <% @post.products.each do |product| %>
    <li>
    <%= product.name %>
    <%= form_for [@post, product.taggings.new] do |f| %>
      <%= f.hidden_field :product_id %>
      <%= f.submit 'tag' %>
    <% end %>
    </li>
  <% end %>
</ul>

Вы можете сделать это позже с помощью CSS / JS.

И контроллер для создания тегов.

class TaggingsController < ApplicationController
  # POST /posts/:post_id/taggings
  def create
    @post = Post.find(params[:post_id])
    @tagging = @post.taggings.new(product: Product.find(params[:tagging][:product_id]))
    if @tagging.save
      redirect_to @product, success: 'Tagging saved.'
    else
      redirect_to @product, error: 'Tagging not saved.'
    end
  end
end
...