Rails 5:对象的父ID在新动作和创建动作之间丢失

时间:2016-11-03 00:26:55

标签: ruby-on-rails ruby-on-rails-5

我正在尝试创建一个post,其中包含表单所在的forum_id。我需要两个ID才能保存在对象中以实现该目标。

我使用@post初始化new操作中的新@post = Forum.find(params[:forum_id]).posts.build 哪个会按照预期的方式将包含forum_id的帖子的未保存实例吐出来。

然后我在这里填写表格:

<%= form_for @post, :url => {:controller => "posts", :action => "create"} do |f| %>
  <% if @post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

      <ul>
      <% @post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %>
    <%= f.text_field :title, class: "form-control" %>
  </div>

  <div class="field">
    <%= f.label :description %>
    <%= f.text_area :description, class: "form-control" %>
  </div>

  <div class="actions">
    <%= f.submit class: "btn btn-primary" %>
  </div>
<% end %>

当我点击提交按钮并在post_params操作中的@post = Post.new(post_params)行之后用byebug检查create时,只有:title:description来了通过。 forum_id在两次操作之间丢失,如果没有它,我就无法保存@post。我:forum_id已将post_params列入白名单但未通过。我认为如果在post操作中使用new创建forum_id的实例,则该实例应该保留在create内的post_params操作中这里错了。以下是可能有助于解决我的问题的相关信息。

我的模特关系:

# User model
has_many :forums
has_many :posts

# Forum model
belongs_to :user
has_many :posts

# Post model
belongs_to :user
belongs_to :forum

# post_controller
def new
  @post = Forum.find(params[:forum_id]).posts.build
end

后控制器

def create
  @post = Post.new(post_params)
  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

...
 # Rest of actions
...
def post_params
    params.require(:post).permit(:title, :description, :forum_id, :user_id)
  end
end

1 个答案:

答案 0 :(得分:2)

表格没有提交forum_id,因为它不存在

我认为您需要将此添加到该表单

<%= f.hidden_field :forum_id %>