如何使用另一个对象的id调用对象的create方法?

时间:2013-09-09 15:31:12

标签: ruby-on-rails ruby-on-rails-4

我正在尝试使用评论功能构建一个库。考虑有3个类:专辑,照片,评论。这些对象的关系是Album有很多照片,Photo有很多评论。

每个注释都由注册用户保留,因此在注释对象中有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)从之前的“show”页面传递给create方法。是否只有通过表格中的隐藏字段传递它?在Rails中有更优雅的方式吗?另外,关于安全问题,如果我通过隐藏字段检索photo_id,是否有人能够编写特定的“帖子”请求,以便将评论发布到相册中的所有照片? (就像很久以前在php论坛中的垃圾邮件发送者一样..)

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

1 个答案:

答案 0 :(得分:1)

查看嵌套资源http://guides.rubyonrails.org/routing.html#nested-resources

上的rails指南

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

resources :photos do
  resources :comments
end

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

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帮助器中抓取了它。由于您已经登录,因此无法从Web传递它。