我正在编写一个编辑日历应用程序的表单。我有两件事非常相似且无法正常工作。
使用3种型号:平台,帖子和日历。他们是联接表。平台< =>发布,发布< =>日历
Post/new & Post/edit form:
<div class="container">
<div class="form-field">
<%= form_for @post do |f| %>
<%= f.label :title %>
<%= f.text_field :title, required: true %> <br>
Title is required.
</div>
<div class="form-field">
<%= f.label :content%>
<%= f.text_area :content%>
</div>
<div class="form-field">
<%= f.label :link %>
<%= f.text_field :link %>
</div>
<div class="file-field">
<%= f.label :picture%>
<%= f.file_field :picture, id: :post_picture%>
</div>
<div class="file-field">
<%= f.label :finalized %>
<%= f.radio_button :finalized , true%>
<%= f.label :finalized, "Yes" %>
<%= f.radio_button :finalized, false %>
<%= f.label :finalized, "No" %>
</div>
<%= f.hidden_field :user_id %> <br>
<div class="form-field">
<%= f.fields_for :platform_attributes do |platform| %>
<%= platform.label :platform, "Social Platforms"%>
<%= platform.collection_check_boxes :platform_ids, Platform.all, :id, :name %> <br> <br>
</div>
<div>
<h4> Or Create a new platform: </h4>
<%= platform.label :platform, 'New Platform'%>
<%= platform.text_field :name%> <br> <br>
</div>
<% end %>
<%= f.submit%>
<% end %>
</div>
我的帖子控制器正在处理复选框问题和“计划发布”问题。它只允许我安排一个日历,并且不会保存更新并添加其他日历。
Posts Controller:
class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :schedule_post, :destroy]
def new
@posts = current_user.posts.select {|p| p.persisted?}
@post = current_user.posts.build
@platforms = Platform.all
end
def edit
@calendars = current_user.calendars
@platforms = Platform.all
end
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to post_path(@post)
else
redirect_to new_post_path
end
end
def update
@post.update(post_params)
if @post.save
redirect_to post_path(@post), notice: 'Your post has been updated.'
else
redirect_to edit_post_path(@post)
end
end
def schedule_post
@calendar_post = CalendarPost.new(calendar_post_params)
if @calendar_post.save
binding.pry
redirect_to post_path(@post)
else
render 'show'
end
end
private
def set_post
@post = Post.find(params[:id])
end
def set_calendars
@calendars = current_user.calendars
end
def post_params
params.require(:post).permit(:title, :content, :link, :finalized, :picture, :user_id, :platform_attributes => [:platform_ids, :name])
end
def calendar_post_params
params.require(:calendar_post).permit(:post_id, :calendar_id, :date, :time)
end
end
我希望用户能够将帖子添加到多个平台和多个日历中,因为有些人可能需要它的多功能性。
我的Post模型中也有我的二传手。
class Post < ApplicationRecord
has_many :calendar_posts
has_many :calendars, through: :calendar_posts
has_many :platform_posts
has_many :platforms, through: :platform_posts
belongs_to :user
def platform_attributes=(platform_attributes)
if platform_attributes['platform_ids']
platform_attributes.platform_ids.each do |id|
platform = Platform.find(id: id)
self.platforms << platform
end
end
if platform_attributes['name'] != ""
platform = Platform.find_or_create_by(name: platform_attributes['name'])
self.platforms << platform
end
end
想法?为什么如果他们选择不止一个日历,他们不会保存到多个日历或多个平台?
以下是更新后的代码......以及我对这些变化及其发生情况的了解。
我的提交按钮因我的表格上的某些奇怪的原因而无法正常工作,所以我试图提交参数,但即使我提出它也不会给我参考,没有任何事情发生。
在表单上,您可以选择复选框或添加平台。如果您添加一个平台,它会创建一个,但它也不会保存您选择的其他平台。如果您要编辑帖子,然后单击“随更改提交”,则根本不会加载任何页面,并且日志中不会发生任何事情。它只是空闲。
答案 0 :(得分:0)
<%= f.fields_for :platform_attributes do |platform| %>
假设您正在创建一个平台...它说&#34;这些是此平台的字段&#34;
但platform_ids
旨在选择一组平台......并且可能应该在fields_for
部分之外(仅应包围name
字段)。
尝试以下内容:
<div class="form-field">
<%= f.label :platform_ids, "Social Platforms"%>
<%= f.collection_check_boxes :platform_ids, Platform.all, :id, :name %> <br> <br>
</div>
<div>
<%= f.fields_for :platform_attributes do |platform| %>
<h4> Or Create a new platform: </h4>
<%= platform.label :name, 'New Platform'%>
<%= platform.text_field :name%> <br> <br>
<% end %>
<%# end fields_for %>
</div>
此外,您还需要适当更新许可/要求,例如
def post_params
params.require(:post).permit(:title, :content, :link, :finalized, :picture, :user_id, :platform_ids, :platform_attributes => [:name])
end
注意:未经测试 - 错误留给读者练习;)