我的应用程序有一些问题,我有帖子,帖子has_many响应 当我为帖子创建新的响应时,没有添加到db'responce'post_id中 我的routes.rb
resources :categories do
resources :posts
end
resources :posts do
resources :responces
end
控制器
class ResponcesController < ApplicationController
def new
@post = Post.find(params[:post_id])
@responce = @post.responces.new(post_id:params[:post_id])
end
def create
@responce = current_user.responces.build(responce_params)
@post = Post.find(params[:post_id])
if @responce.save
flash[:success] = "Вы откликнулись на задание"
redirect_to post_path @post
else
render 'new'
end
end
def show
end
private
def responce_params
params.require(:responce).permit(:price, :comment, :post_id)
end
end
视图
<%= form_for([@post, @responce]) do |f| %>
<%= f.text_area :price %>
<%= f.submit "GO", class: "btn btn-large btn-primary" %>
<% end %>
但如果添加到视图中
<%= f.collection_select :post_id, Post.all, :id, :name %>
rails将post_id创建到db
帮助
答案 0 :(得分:1)
你做错了几件事。
首先:我认为您不需要为同一型号提供两个单独的资源。我建议像这样把所有三种资源嵌套在一起。
resource :categories do
resource :posts do
resource :responces
end
end
这样你就可以在params哈希中找到所需的category_id和post_id。
我还建议将:shalow => true
添加到:categories
资源,以使您的路线更漂亮。
第二次:您需要在创建操作中分配params[:post_id]
,如下所示。
@responce = current_user.responces.build(responce_params)
@responce.post_id = params[:post_id]
@post = @responce.post
Alternatevely 您可以在表单中添加一个隐藏字段,如下所示,但我不喜欢这种方法,因为它可能会带来安全风险。
<%= form_for([@post, @responce]) do |f| %>
<%= f.text_area :price %>
<%= f.hidden_field :post_id, :value => @post.id %>
<%= f.submit "GO", class: "btn btn-large btn-primary" %>
<% end %>
答案 1 :(得分:0)
在您的表单中,您没有传递post_id。你可能想要这样的东西:
<%= form_for([@post, @responce]) do |f| %>
<%= f.text_area :price %>
<%= f.hidden_field :post_id, :value => @post.id %>
<%= f.submit "GO", class: "btn btn-large btn-primary" %>
<% end %>
隐藏字段会将当前帖子的ID作为post_id参数传递到表单中。