如何关联用户提交的电影评论至对应详情页?是否需用params与redirect_to?
实现评论与电影详情页的关联及实时展示
你的思路方向完全正确!要把用户提交的评论关联到对应电影详情页并实时展示,确实需要结合params哈希获取关联信息,再通过redirect_to回到电影页面。下面是具体的实现步骤,帮你把整个流程串起来:
1. 配置嵌套路由确保关联关系
首先在config/routes.rb里设置嵌套路由,让评论和所属电影绑定:
resources :movies do resources :reviews, only: [:create] # 仅保留处理评论提交的create动作 end
2. 完善ReviewsController的create动作
在app/controllers/reviews_controller.rb中,我们需要从params里拿到电影ID,创建与该电影关联的评论,成功后跳转回电影详情页:
def create # 通过params[:movie_id]定位到当前电影 @movie = Movie.find(params[:movie_id]) # 构建关联到该电影的评论,传入用户提交的内容 @review = @movie.reviews.build(review_params) # 如果你的应用有用户系统(比如Devise),可以关联评论者 # @review.user = current_user if @review.save # 跳转回电影详情页并显示成功提示 redirect_to movie_path(@movie), notice: '评论提交成功!' else # 保存失败时跳转回详情页,显示错误提示 redirect_to movie_path(@movie), alert: '评论提交失败,请检查内容后重试。' end end private # 强参数过滤,仅允许提交content字段 def review_params params.require(:review).permit(:content) end
3. 在电影详情页添加评论表单与展示区
在app/views/movies/show.html.erb里,添加提交评论的表单,同时展示已有评论:
<!-- 评论提交表单 --> <h3>写下你的评论</h3> <%= form_with(model: [@movie, @movie.reviews.build], local: true) do |form| %> <div class="form-group"> <%= form.label :content, '评论内容' %> <%= form.text_area :content, rows: 3, class: 'form-control' %> </div> <%= form.submit '提交评论', class: 'btn btn-primary' %> <% end %> <!-- 已有评论展示区 --> <h3>用户评论</h3> <% if @movie.reviews.empty? %> <p>还没有评论,快来写下第一条吧!</p> <% else %> <% @movie.reviews.each do |review| %> <div class="card mb-2"> <div class="card-body"> <p class="card-text"><%= review.content %></p> <!-- 如果关联了用户,可以显示评论者信息 --> <!-- <p class="card-text text-muted">评论者:<%= review.user.name %></p> --> </div> </div> <% end %> <% end %>
关键逻辑说明
params的作用:params[:movie_id]帮我们定位到用户当前访问的电影,params[:review][:content](通过review_params过滤后)就是用户提交的评论内容,两者结合就能创建和电影绑定的评论。redirect_to的作用:评论保存成功后,跳回对应的电影详情页movie_path(@movie),页面重新加载后,新创建的评论就会实时显示在页面上。
这样一套流程下来,用户在电影详情页提交的评论就会正确关联到该电影,并且提交后立刻在页面上看到自己的评论啦。
内容的提问来源于stack exchange,提问作者Joseph H.
相关产品推荐
相关产品推荐

