0

我正在尝试建立一个具有评论功能的画廊。考虑有 3 个类:相册、照片、评论。这些对象的关系是相册有很多照片,照片有很多评论。

每个评论都是注册用户留下的,因此评论对象中有comment_text、user_id和photo_id(指评论所属的照片)。

我正在尝试在每张照片的“显示”视图下创建一个评论表单。下面是一些 Controller 和 Show 视图:

控制器/photos_controller.rb

class PhotosController < ApplicationController
    ...
    def show
       @photo = Photo.find(params[:id])
       @new_comment = @photo.comments.build if user_signed_in?
       @comment_items = @photo.comments.paginate(page: params[:page])
    end 
    ...
end

意见/照片/show.html.erb

...
<%= form_for @new_comment, html: {method: :post} do |c| %>
    <div class="row">
        <div class="span">
            <%= image_tag current_user.avatar.url(:thumb) %>
        </div>
        <div class="span">
            <p><%= c.label "Enter your comment here:" %></p>
            <p><%= c.text_area :comment_text %></p>
            <p><%= c.submit "Submit Comment", class: "btn btn-tiny" %></p>
        </div>
    </div>
<% end %>

所以问题是当我在编写 CommentsController 时,我不知道如何将照片的 id (photo_id) 从上一个“显示”页面传递给 create 方法。只有通过表单中的隐藏字段传递它才有可能吗?在 Rails 中有没有更优雅的方式来做到这一点?此外,关于安全性的一点,如果我通过隐藏字段检索 photo_id,是否有人能够编写特定的“发布”请求,以便对相册中的所有照片发表评论?(就像很久以前php论坛中的垃圾邮件发送者..)

感谢您阅读本文并提前感谢您的回答!

4

1 回答 1

1

查看有关嵌套资源的 Rails 指南 http://guides.rubyonrails.org/routing.html#nested-resources

你的路线会有这样的东西。

resources :photos do
  resources :comments
end

您的照片控制器将保持不变,但您的评论控制器需要从 url 查找照片

class CommentsController < ApplicationController
    before_action :get_photo
    def create
       @photo.comments.create(params.require(:comment).permit(:comment_text))
       ....
    end 
    ...

    def get_photo
      @photo =  Photo.find(params[:photo_id])
    end
end

照片视图会有

<%= form_for [@photo,Comment.new], html: {method: :post} do |c| %>
    <div class="row">
        <div class="span">
            <%= image_tag current_user.avatar.url(:thumb) %>
        </div>
        <div class="span">
            <p><%= c.label "Enter your comment here:" %></p>
            <p><%= c.text_area :comment_text %></p>
            <p><%= c.submit "Submit Comment", class: "btn btn-tiny" %></p>
        </div>
    </div>
<% end %>

这应该调用 new_photo_comment_path

至于 user_id,我只是从user_signed_in助手那里得到的。由于您已经让他们登录,因此从网络传递它是没有意义的。

于 2013-09-09T16:25:34.817 回答