【问题标题】:In creating a comment, getting "Render and/or redirect were called multiple times" for no apparent reason在创建评论时,无缘无故地获得“多次调用渲染和/或重定向”
【发布时间】:2019-08-07 14:42:49
【问题描述】:

我通过设计、发布和评论获得用户。在显示每个帖子时,我想显示评论。

问题是我在创建评论时不断收到“多次调用渲染和/或重定向...”错误。现在,这是一个症状,而不是我想要解决的原因。调用此错误时,将突出显示 redirect_to 失败,这意味着未创建注释。

我该如何解决这个问题?此外,虽然它是次要的,但什么可以修复渲染和/或重定向...错误?

另一个细节:当我在 cmets 控制器中使用 :id 而不是 :post_id 时,它会引发错误(找不到没有 ID 的 Post)。当我在帖子控制器显示中使用 :post_id 而不是 :id 时(以提供视图表单),它会引发错误(找不到没有 ID 的帖子)

更新: 在我的comment.rb 和user.rb 中,我有belongs_to user 和has_many cmets。除了用户有很多帖子和帖子有很多 cmets。我删除了那些用户评论连接。然后我在 show.html.erb 中将@post、@comment 替换为@post、@post.cmets.build。现在它似乎保存到数据库中。但它仍然会引发“渲染和/或...”错误。我怎样才能解决这个问题?

从我的帖子列表中,我通过 post_path(post.id) 转到 show.html.erb。但是当我在 show.html.erb 中使用相同的内容时,它会显示“未定义的局部变量或方法‘post’”所以我切换到@post,然后抛出上述错误。

无论我阅读了多少文档,我都不清楚这一点。即使我没有在模型和数据库中明确表示我的用户是否连接到评论(我的评论有 post_id 但没有 user_id)?如何?

帖子控制器展示:

    def show
        @user = current_user
        @post = Post.find(params[:id])
        @comment = @post.comments.new
    end

show.html.erb:

<%= form_for([@post, @comment]) do |form| %>
  <p>
    <%= form.text_area :text %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

完整的cmets控制器:

    def show
        @post = Post.find(params[:post_id])
        @comment = @post.comments.new
        render :template => 'posts/show'
    end

    def new
        @post = Post.find(params[:post_id])
        @comment = @post.comments.new
        render :template => 'posts/show'
    end

    def create

        @post = Post.find(params[:post_id])
        @comment = @post.comments.create(comment_params)

        render :template => 'posts/show'

        if @comment.save
            redirect_to post_path(@post), notice: "Success!~"
        else 
            redirect_to post_path(@post), alert: "Failure!" 
        end

    end

    private
        def comment_params
            params.require(:comment).permit(:text)
        end

路线

  resources :users do
    resources :posts, shallow: true do
      resources :comments, shallow: true
    end
  end

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在 cmets 控制器的创建操作中,您调用了

    render :template => 'posts/show'
    

    然后重定向到post_path

    正如错误消息所说,您不能在同一操作中同时呈现和重定向。

    目前尚不完全清楚您要完成什么,但我猜您可以简单地删除 render 调用。

    编辑:

    如果你的 cmets 表有 post_id 外键,这意味着你的 Comment 模型也应该指定 belongs_to :post,同样使用相同的外键,你的 Post 模型应该有 'has_many :posts'。

    我将对您的架构做出几个假设,但我相信您想要这个:

    # app/models/post.rb
    class Post < ApplicationRecord
      belongs_to :user
      has_many :comments, dependent: :destroy
    end
    
    # app/models/comment.rb
    class Comment < ApplicationRecord
      belongs_to :post
      has_one :user, through: :post
    end
    
    # app/models/user.rb
    class Comment < ApplicationRecord
      has_many :posts, dependent: :nullify
    end
    

    通过关联通知 has_one,这将允许您执行以下操作:

    Comment.find(id).user
    

    这将返回posts表中user_id列引用的用户记录。

    【讨论】:

    • 谢谢!如果您也可以回答这个问题,我将不胜感激,但如果没有,我会将其作为分离问题发布。 “此外,无论我阅读了多少文档,我都不清楚这一点。我的用户是否连接到评论,即使我没有在模型和数据库中明确表示该连接(我的评论有 post_id 但没有 user_id) ? 怎么做?
    • 编辑了我的答案,评论太长了。希望对您有所帮助。
    • 谢谢你,我已经对答案投了赞成票(尽管它说它不会公开显示,因为我的名声很小)。还有一个问题:当其他用户对我的帖子发表评论时,这是否适用——我仍然可以将该特定用户与他们的评论相关联吗(我打算在他们的 cmets 旁边显示他们的名字)?
    • 最合乎逻辑的方法是在评论中添加user_id 外键。他们在 Comment 模型中有一个 belongs_to :user,在 User 模型中定义了 has_many :comments。创建评论时,在 CommentsController 中,您将使用当前经过身份验证的用户(通常为current_user)并将其与评论记录相关联。 @post.comments.create { user: current_user }.
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多