1

投稿と投稿の 2 つのモデルに属するコメント モデルがあります。

class Comment < ActiveRecord::Base
  attr_accessible :content, :show
  belongs_to :commentable, :polymorphic => true
end

class Submission < ActiveRecord::Base
    has_many :comments, :as => :commentable, :dependent => :destroy
end

投稿はネストされたルートであり、投稿はそうではありません。

私のコメントコントローラーで:

  def create
    @commentable = find_commentable
    @comment = @commentable.comments.build(params[:comment])
    @comment.user = current_user
    if @comment.save
      #CommentMailer.comment_email(@user, @comment, @commentable).deliver
      flash[:notice] = "Successfully created comment."
      if @commentable == @submission
        redirect_to [@contest, @commentable]
      else
      redirect_to [@commentable]
      end
    else
     render :action => 'new'
    end
  end

find_contest

def find_contest
    @contest = Contest.find(params[:contest_id])
end

find_commentable:

def find_commentable
  params.each do |name, value|
    if name =~ /(.+)_id$/
      return $1.classify.constantize.find(value)
    end
  end
  nil
end

@commentable 経由での投稿へのリダイレクトは正常に機能しますが、投稿へのリダイレクトではコンテストが見つかりません。

Started POST "/submissions/36/comments" for 127.0.0.1 at 2012-11-30 18:34:41 -0800
Processing by CommentsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"R62NH5/EE34FPapEqy7mfpa0wKz18GtSdhH8MGYq2Ec=", "comment"=>{"content"=>"test", "show"=>"true"}, "commit"=>"Create Comment", "submission_id"=>"36"}
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
  Submission Load (0.3ms)  SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 ORDER BY submissions.created_at DESC LIMIT 1  [["id", "36"]]
Completed 500 Internal Server Error in 116ms

ActiveRecord::RecordNotFound (Couldn't find Contest without an ID):
  app/controllers/comments_controller.rb:19:in `create'

提出ルートの変更:

 submissions GET    /submissions(.:format)           submissions#index
             POST   /submissions(.:format)           submissions#create
new_submission GET    /submissions/new(.:format)       submissions#new
edit_submission GET    /submissions/:id/edit(.:format)  submissions#edit
  submission GET    /submissions/:id(.:format)       submissions#show
             PUT    /submissions/:id(.:format)       submissions#update 
             DELETE /submissions/:id(.:format)    submissions#destroy

提出フォーム:

<%= simple_form_for @submission, :html => { :multipart => true } do |f| %>
<div class="span7 offset2 submission">
    <fieldset class="well pleft80 edit">
      <%= f.hidden_field :contest_id , :value => params[:contest_id] %>
      <%= f.input :title %>
      <%= f.input :description %>
      <%= f.input :comment_show, :as => :hidden, :input_html => { :value => true }  %>
    </fieldset>
    <fieldset class="well pleft80 noborder">
      <%= f.fields_for :image do |img_field| %>
        <h3>Upload Photo<%= img_field.file_field :source %></h3>
      <% end %>
    </fieldset>
    <div class ="form-actions pleft80">
      <%= f.submit nil, :class => 'btn btn-primary btn-large' %>
    </div>
</div>
<% end %>
4

2 に答える 2

2

何かをインスタンス化または分類する必要はありません。

redirect_to @comment.commentable

それができない場合は、そのためのグローバルヘルパーモジュールを作成し、それをコントローラーに含める必要があります。

module RouteHelpers

  def comment_association_redirect_to(comment)
    item = comment.commentable
    case item.class.to_s
      when 'Submission'
        redirect_to submission_path(item)
      end
  end

end

ApplicationControllerそしてそれを:内に含めます

include RouteHelpers

次にcomment_association_redirect_to、アプリのどこからでも呼び出すことができます(コントローラーなど)。

于 2012-12-01T16:53:45.370 に答える
0

ネストされたルーティングをアプリから取り除いたところ、問題なく動作し、はるかに簡単になりました。ビューが依存関係を関連付ける必要がある場合に、ネストされたルーティングを使用する正当な理由を思いつくことができるかどうかはわかりません。

于 2012-12-01T19:01:12.370 に答える