Не отображать Has Many Through в формах - PullRequest
0 голосов
/ 22 марта 2020

Я создал ассоциации Active Record для подфайма и сообщений. Моя проблема в том, что has_many через ассоциацию не сохраняет. Мне интересно, почему.

Has_many: через ассоциации

class Post < ApplicationRecord
  has_many :sub_posts
  has_many :subfeds, through: :sub_posts
  belongs_to :users, optional: true
end

class Subfed < ApplicationRecord
  belongs_to :user, optional: true
  has_many :sub_posts
  has_many :posts, through: :sub_posts
end

class SubPost < ApplicationRecord
  belongs_to :post, optional: true
  belongs_to :subfed, optional: true
end

Вот ассоциации баз данных

    class CreatePosts < ActiveRecord::Migration[5.0]
      def change
        create_table :posts do |t|
          t.string :title
          t.string :summary

          t.timestamps
        end
      end
    end

class CreateSubfeds < ActiveRecord::Migration[5.0]
  def change
    create_table :subfeds do |t|
      t.string :title
      t.string :content

      t.timestamps
    end
  end
end

class CreateSubPosts < ActiveRecord::Migration[5.0]
  def change
    create_table :sub_posts do |t|
      t.belongs_to :subfed
      t.belongs_to :post

      t.timestamps
    end
  end
end

Думаю, проблема в синтаксисе формы или в действии контроллера, потому что я думаю, что у меня есть сильные параметры правильно.

Posts controller
class PostsController < ApplicationController

  def index
    @posts = Post.all
  end

  def new
    @post = Post.new
  end

  def edit
    @post = Post.find(params[:id])
  end

  def show
    @post = Post.find(params[:id])
  end

  def create
    @post = Post.create(post_params)

    if @post.save
      redirect_to post_url(@post)
    else
      Post.all
      render :index
    end
  end

  def update
    @post = Post.find(params[:id])
    @post.update(post_params)
    redirect_to post_url(@post)
  end

  def destroy
    @post = Post.find(params[:id]).destroy
    redirect_to posts_path
  end

  private
    def post_params
      params.require(:post).permit(:title, :summary, :id, subfed_id: [] )
    end

end

Subfeed Controller

class SubfedsController < ApplicationController

  def index
    @subfeds = Subfed.all
  end

  def new
    @subfed = Subfed.new
  end

  def edit
    @subfed = Subfed.find(params[:id])
  end

  def show
    @subfed = Subfed.find(params[:id])
  end

  def create
    @subfed = Subfed.create(subfed_params)

    if @subfed.save
      redirect_to subfed_url(@subfed)
    else
      Subfed.all
      render :index
    end
  end

  def update
    @subfed = Subfed.find(params[:id])
    @subfed.update(subfed_params)
    redirect_to subfed_url(@subfed)
  end

  def destroy
    @subfed = Subfed.find(params[:id]).destroy
    redirect_to subfeds_path
  end

  private
    def subfed_params
      params.require(:subfed).permit(:title, :content, :id )
    end

end

Я создал коллекцию collection_select в представлении сообщения # новое, чтобы связать новое сообщение с выбранным подфидом.

<h1>Create a new Post</h1>

<%= form_tag posts_path do %>
<%= form_errors_for @post %>

  <label>Post Title:</label><br>
  <%= text_field_tag  :'post[title]' %><br>

  <label>Post Summary:</label><br>
  <%= text_field_tag  :'post[summary]' %><br>

  <%= collection_select :post, :subfed_id, Subfed.all, :id, :title %><br>

  <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
  <%= submit_tag "Create" %>
<% end %>

Но когда я переключаюсь на подфид # show и вызываю сообщения, связанные с этим подфидом, я не получаю ошибок, но ассоциация отказывается отображаться. Мне интересно, что не так, как сохраняет сообщение, просто не связано с подфидом.

<h1><%= @subfed.title %></h1>

<p><%= @subfed.content %></p>

<% @subfed.posts.each do |post| %>
  <p><%= link_to post.title, post_path(post) %></p>
<% end %>

<%= link_to "Back", subfeds_path %><br>
 <%= link_to "Edit Subfeed", edit_subfed_path(@subfed) %><br>
  <%= button_to "Delete Subfeed", subfed_path(@subfed), method: :delete %><br>

пожалуйста, помогите, заранее спасибо!

...