Как реализовать Update и уничтожить методы с помощью has has many? Рельсы 5 - PullRequest
0 голосов
/ 30 августа 2018

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

Мои модели: Почтовая модель

class Post < ApplicationRecord
 has_many :comments, dependent: :destroy
 has_many :has_categories
 has_many :categories, through: :has_categories

 validates :title, presence: true,
 length: { minimum: 5 }
 after_create :save_categories

 def categories=(value)
  @categories = value
 end

 private

 def save_categories
   @categories.each do |category_id|
    HasCategory.create(category_id: category_id, post_id: self.id)
   end
 end
end

Модель Has_Category

class HasCategory < ApplicationRecord
  belongs_to :post
  belongs_to :category
end

Категория Модель

class Category < ApplicationRecord
  validates :name, presence: true
  has_many :has_categories
  has_many :posts, through: :has_categories
end

Так что в моей частичной форме для новых и редактируемых действий это похоже на

<%= form_with model: @post, local: true do |form| %>
  <!--Inputs before the categories-->
  <div>
    <label>Categories</label>
    <% @categories.each do |category| %>
      <div>
        <%= check_box_tag "categories[]", category.id %> <%= category.name %>
      </div>
    <% end %>
 </div>
 <div>
  <%= form.submit %>
 </div>
<% end %>

Метод создания и обновления моего posts_controller

def create
  @post = Post.new(post_params)
  @post.categories = params[:categories]
  if @post.save
    redirect_to @post
  else
    render :new
  end
end

def update
  @post = Post.find(params[:id])
  @post.categories = params[:categories]
  if @post.update(post_params)
    redirect_to @post
  else
    render :edit
  end
end

Мое действие создания работает, но действие обновления просто обновляет входные данные до check_box_tag. Я знаю, что метод save_categories в моей модели Post - это тот, кто берет массив, полученный из формы, и создает ассоциацию HasCategory. Как выполнить действие обновления или даже заданное действие уничтожения? Ситуация, которая является ассоциацией многих ко многим?

1 Ответ

0 голосов
/ 30 августа 2018

Строка has_many :categories, through: :has_categories дает вам category_ids для публикации. Таким образом, вы можете изменить свою форму:

<%= form_with model: @post, local: true do |form| %>
  <!--Inputs before the categories-->
  <div>
    <label>Categories</label>
    <%= f.collection_check_boxes(:category_ids, @categories, :id, :name) 
  </div>
  <div>
   <%= form.submit %>
  </div>
<% end %>

и контроллер:

def create
  # you need it here for correct rerendering `new` on validation error
  @categories = Category.all # or maybe you have here more complicated query
  @post = Post.new(post_params)      
  if @post.save
    redirect_to @post
  else
    render :new
  end
end

def update
  # you need it here for correct rerendering `edit` on validation error
  @categories = Category.all # or maybe you have here more complicated query        
  @post = Post.find(params[:id])
  if @post.update(post_params)
    redirect_to @post
  else
    render :edit
  end
end

private

def post_params
  params.require(:post).permit(:name, :some_other_post_params, category_ids: [])
end

Вам необходимо удалить обратный вызов и метод categories=(value) из модели Post. И определите @categories в действиях new и edit. Если оно равно Category.all, вы можете просто поместить его в форму: f.collection_check_boxes(:category_ids, Category.all, :id, :name), без определения @ variable

...