如何通过html表单建立多个模型关联?

时间:2011-06-14 19:42:59

标签: ruby-on-rails associations html-form

我想在网站上为讨论创建页面,在这些讨论页面上,用户可以撰写帖子。帖子需要属于讨论和用户,以及对用户的讨论。

因此我创建了两个模型,两个控制器,一个部分放在讨论节目页面上。请注意,来自控制器的重定向只是以逻辑方式分配给root_pages和其他,因为我想在表单工作后处理重定向。我没有附加用户模型,因为它很长,我认为没有必要。

我的问题是我无法让帖子控制器为新帖子分配正确的讨论ID。我希望将其记录下来,以便帖子与作者user_id(有效)和discussion_id相关联。我知道使用@ post.discussion_id = @ discussion.id 将无法正确分配,但我已经测试了@ post.discussion_id = 1以查看其余代码是否有效(确实如此) 。

如何更改表单/控制器的设置以在此处分配discussion_id?任何帮助将不胜感激!

讨论控制器:

class DiscussionsController < ApplicationController
  def show
    @discussion = Discussion.find(params[:id])
    @title = @discussion.title
    @post = Post.new if signed_in?
  end

结束

讨论模型:

class Discussion < ActiveRecord::Base
  attr_accessible :title, :prompt
  belongs_to :user

  validates :title, :presence => true, :length => { :within => 5..100 }
  validates :prompt, :presence => true, :length => { :within => 5..250 }
  validates :user_id, :presence => true
  has_many :posts, :dependent => :destroy

 default_scope :order => 'discussions.created_at DESC'
end

后控制器:

class PostsController < ApplicationController
  def create
    @post = current_user.posts.build(params[:post])

    @post.discussion_id = @discussion.id
    if @post.save
      redirect_to discussion_path
    else
      redirect_to user_path
    end
  end

结束

发布模型:

class Post < ActiveRecord::Base
  attr_accessible :content

  validates :content, :presence => true, :length => { :maximum => 10000 }
  validates :user_id, :presence => true
  validates :discussion_id, :presence => true
  belongs_to :user
  belongs_to :discussion

  default_scope :order => 'posts.created_at ASC'
end

部分发布表格:

<%= form_for @post do |f| %>
<%= render 'shared/error_messages' %>
<div class="field">
    <%= f.text_area :content, :class => "inputform largeinputform round" %>
</div>

<div class="actions">
    <%= f.submit "Post", :class => "submitbutton round" %>
</div>
<% end %>

2 个答案:

答案 0 :(得分:0)

在PostsController中

你没有在create方法中创建一个@discussion。

答案 1 :(得分:0)

您的问题是您没有将@discussion放入帖子控制器的机制一种方法可能是将讨论ID放在部分表单中的隐藏字段中,然后在控制器中将其作为参数读取。

兰斯