Я создал ассоциации 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>
пожалуйста, помогите, заранее спасибо!