如何将第一个嵌套对象放入第二级嵌套对象控制器?

时间:2014-06-13 10:21:12

标签: ruby-on-rails partial-views

我有一个具有显示页面的角色模型。在展示页面上,我有一个通过部分动态生成的注释循环。在那部分评论中,我有另一部分投票,其中包含投票按钮。当然,我想允许对评论进行投票。

我不确定如何将评论对象放入投票控制器(或VotesController模块,具体取决于实施)以创建投票。

将字符对象id添加到投票控制器很简单,因为实际视图是字符显示页面,但通过单击嵌套的部分中的投票按钮获取从部分显示的特定注释的id在注释中,partial部分导致我为访问该注释的语法画一个空白。

(我使用acts_as_votable进行投票,使用acts_as_commentable进行评论。)


应用/视图/字符/ show.html.haml

= render partial: 'comments/comment', collection: @comments, as: :comment

应用/视图/评论/ _form.html.haml

.comment{ :id => "comment-#{comment.id}" }
  %hr

  = render partial: 'votes/vote_comment'

  %h4
    #comment body

应用/视图/票/ _vote_comment.html.haml

.vote-comment-buttons
  = link_to image_tag("upvote.png"), votes_upvote_path(), method: :post, remote: true
  = link_to image_tag("downvote.png"), votes_downvote_path(), method: :post, remote: true

应用/控制器/ votes.html.haml

VotesController < ApplicationController

  def upvote
    # Need the specific comment or comment id whose vote button was clicked.
  end

  def downvote
    # Need the specific comment or comment id whose vote button was clicked.
  end

end

1 个答案:

答案 0 :(得分:1)

嗯,这是基本提示:

  1. 您无法通过HTTP传递ruby对象,但您可以传递它们的idtype以在控制器中构建它们。
  2. 即使您键入comment_path(comment)之类的内容,该注释中只有id会传递给您的操作。通过观察您的操作代码(它应该包含类似Comment.find(params[:id]))的内容可以轻松检查。
  3. 传递任何所需的其他参数可以通过将它们提供给您的路线助手来完成,例如:some_voting_path(commentable_id: 14, commentable_type: 'character')
  4. 您可以使用params['commentable_type']或您通过网址传递的任何值来访问操作中的参数。如果您遵循传递idtype方法,您应该可以进行一些元编程:

    def upvote_method
      model = params[:commentable_type].camelize.constantize # => e.g., Post
      object = model.find(params[:commentable_id]) # => post object
      # here goes your inner logics
    end
    
  5. 请注意,如果您使用GET方法发送请求,这些参数将显示在您的浏览器网址中。但是,您不应在此处使用GET,因为投票会更改数据库中对象的状态。