【问题标题】:Ruby on Rails: How to save a model that is dependant on two others?Ruby on Rails:如何保存依赖于其他两个模型的模型?
【发布时间】:2013-02-20 17:29:57
【问题描述】:

我对 Ruby on Rails 还很陌生。我已经建立了一个基本的用户/帖子模型,它允许用户创建帖子。我正在尝试为帖子创建评论,这也会将评论与创建它的用户相关联。

我已经设置了关系,这样一个用户有很多帖子和评论,一个帖子属于一个用户并有很多评论,一个评论既属于一个帖子又属于一个用户。

我的问题是在尝试保存评论时出现的。在我的评论控制器中:

def create
    @comment = current_user.comments.build(params[:comment])
end

这不起作用,并且没有说明评论属于哪个帖子。我还在“显示帖子”页面上显示“添加评论”表单,以便在帖子下方创建评论墙,但我的表单仍然只是说

<%= form_for @comment do |f| %>

并且不会将评论与 Show 下 Posts 控制器中的 Post 相关联。

我意识到可能有一个直截了当的答案,但找不到任何可以解释我的具体问题的资源。任何帮助表示赞赏。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    我会说您主要是将评论添加到特定帖子。所以从这里开始:

    def create
      @post = Post.find(params[:post_id])  # <== this may be just `id`
      @comment = @post.comments.build(params[:comment])
      @comment.user = current_user
    
      if @comment.save
        # ... do things
      else
        # ..  render error
      end
    end
    

    为此,您需要嵌套路由:

    resources :posts do
      resources :comments
    end
    

    您的form_for 需要指明嵌套路由:

    <%= form_for [@post, @comment] %>
    

    【讨论】:

    • 正是我需要的。非常感谢。
    【解决方案2】:

    您在 CommentsController#create 中做的事情是正确的

    @comment = current_user.comments.build(params[:comment])
    

    您缺少的部分是在您的 params[:comment] 中包含 post_id。这应该没问题,因为您总是知道您正在评论的帖子,您正在展示的帖子。所以在你的form_for @comment中添加以下内容

    <%= f.hidden_field :post_id, @post.id %>
    

    我假设这是在您的显示帖子视图中,并且您在 PostController#show 中设置了@post

    【讨论】:

    • nzifnab 的方法同样有效,如果我从头开始,我可能会选择这种方法。我建议了我的选择,因为它不需要对您的应用进行任何更改。
    【解决方案3】:

    你可以这样做:

    def create
      @comment = Comment.new(params[:comment])
      @comment.user = current_user
      if @comment.save ...
    

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2015-11-16
      • 2010-12-02
      • 2020-04-23
      • 2016-04-09
      • 1970-01-01
      相关资源
      最近更新 更多