在尝试了初始评论中提到的几件事之后仍然无法正常工作 - 我已经在下面进行了修改,以反映这些努力/澄清一些事情。
问题摘要:我无法创建新帖子(答案),其中该帖子的parent_id等于相关问题的帖子的ID。用户从帖子的#show页面开始,点击"回答"。我以为下面的代码会将问题的ID传递给答案帖子' PARENT_ID。但事实并非如此。它返回parent_id = nil
我有一个帖子模型。帖子的post_type_id为1(问题)或2(答案)。
post_type_id = 2的所有帖子都有一个parent_id,指向正在回答的问题的ID。
关于帖子#show我有:
<% case post_type %>
<% when 1 %>
<%= link_to 'Answer', new_post_path(:parent_id => @post.id) %>
<% else %>
<% end %>
当我点击它时,它会转到new_post页面并且网址是: //本地主机:3000 /帖/新PARENT_ID = 6
(这个例子中的问题有id = 6,所以我认为看起来是正确的。)
在我的帖子控制器中,我有:
def new
@post = Post.new
end
def show
end
def create
@post = Post.new(post_params)
@post.user_id = current_user.id
@post.parent_id = params[:parent_id]
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created, location: @post }
else
format.html { render :new }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
def post_params
params.require(:post).permit(:user_id, :post_type_id, :title, :content, :accepted_answer_id, :parent_id, :score, :answer_count, :favorite_count)
end
我的路线是:
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
在new.html.erb中我有:
<h3>New Post</h3>
<%= render 'form' %>
<%= link_to 'Back', posts_path %>
_form.html.erb是:
<%= simple_form_for(@post) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%- f.association :user %>
<%= f.input :post_type_id, collection: post_types, label: 'What do you want to do?' %>
<%= f.input :title %>
<%= f.input :content %>
<%- f.input :accepted_answer_id %>
<%- f.input :parent_id %>
<%- f.input :score %>
<%- f.input :answer_count %>
<%- f.input :favorite_count %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
我非常感谢有关如何使其发挥作用的任何建议。
谢谢!
答案 0 :(得分:2)
好的,所以您的用户点击了答案,然后将问题ID转发为ROOT参数(params[:parent_id]
)
现在,您想告诉您的新动作,您构建的帖子是问题的答案,因此您应该使用该参数
控制器/ posts_controller.rb
def new
@post = Post.new
@post.parent_id = params[:parent_id] if params[:parent_id]
然后在您的表单中,您可以添加隐藏字段(用户不必关心ID)。我相信如果字段.parent_id
没有设置,它会留下一个空白值并且没有问题
视图/帖/ _form.html.erb
<%= f.hidden_field :parent_id %>
然后当您发布新答案时,将发送:parent_id,您不必担心它
控制器/ posts_controller.rb
def create
@post = Post.new(post_params)
@post.user_id = current_user.id
# No need for the below line, :parent_id is already in post_params
# @post.parent_id = params[:parent_id]
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created, location: @post }
else
format.html { render :new }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
def post_params
params.require(:post).permit(..., :parent_id, ...)
end
编辑:在评论中回答您的问题
为什么@post.parent_id = params[:parent_id]
属于#new
使用这一行,你实际上设置了&#34;模板@post对象的#parent_id内存变量&#34;你正准备#new行动。现在,当您渲染视图时,默认情况下,每个表单助手都会在内存中加载值(如果存在)。当您执行f.input :content
时,form_builder将生成HTML标记,但也会在内存中查找@post.content
。由于模型生成为空白,因此没有值,因此它将显示空字段。因此,当您调用f.hidden_field :parent_id
时,它实际上会找到变量(感谢我们刚刚添加的代码)并使用它。
&lt;% - 而不是&lt;%=
我个人从不使用<%-
,我不得不谷歌,并找到this question。 <%-
只会避免换行,所以它也可以正常工作
为何隐藏字段?
这只是用户体验的问题。隐藏字段将在HTML中写入,但会将其隐藏给用户。用户并没有对你的:parent_id
发表任何不满。您正在使用ActiveRecord,因此ID看起来非常好,但如果您尝试其他数据库系统,您的ID可能看起来像0bef0600008de
。而且您的用户肯定不在乎他正在添加问题0bef0600008de
的答案。
然而,h可能会对此感兴趣:
_form.html.erb
<% if @post.parent_id %> <!-- if variable parent_id exists <=> we are writing an answer -->
<h2>You are writing an answer for the question <%= Post.find(@post.parent_id).title %></h2>
<% end %>