rails 4如何将post_id传递给db

时间:2013-11-14 15:00:35

标签: ruby-on-rails ruby-on-rails-4

我的应用程序有一些问题,我有帖子,帖子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

帮助

2 个答案:

答案 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参数传递到表单中。