简体   繁体   中英

Rails How to set multiple polymorphic in controller?

Rails How to set multiple polymorphic in controller?

Some of codes as follows:

question.rb

has_many :comments, :as => :commentable, :dependent => :destroy

comment.rb

belongs_to :commentable, polymorphic: true

has_many :reports, :as => :reportable, :dependent => :destroy

report.rb

belongs_to :reportable, polymorphic: true

routes.rb

resources :questions do

  resources :comments do 

    resources :reports

end

And then in _comment.html.erb :

<%= link_to "<i class='fa fa-times mr2 fa-fw'></i>Report".html_safe,new_question_comment_report_path(@question,@comment),remote: true %>

My reports_controller.rb

class ReportsController < ApplicationController
  before_action :logged_in_user
  before_action :set_reportable

  def new
    @report = @reportable.reports.new
    respond_to do |format|
      format.html do
        redirect_to @reportable
      end
      format.js
    end
  end

  def create
    @report = @reportable.reports.new report_params
    @report.reporter_id = current_user.id
    if @report.save
      redirect_to @reportable
    end
  end

  def destroy
    @report = Report.find(params[:id])
    @report.destroy
  end

  private
  def set_reportable
    if params[:comment_id]
      @question = Question.find(params[:question_id])
      @reportable = @question.comments.find(params[:comment_id])
    end
  end

  def report_params
    params.require(:report).permit(:content,:radio_content)
  end
end

new.js.erb of reports

$("body").append("<%= j render "reports/reports" %>")
$("#tip-offs").modal('show')

My _reports.html.erb

<div class="modal tip-offs in" id="tip-offs" >
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button class="close" data-dismiss="modal" type="button">
          <span aria-hidden="true">&times;</span> <span class="sr-only">Close</span>
        </button>
        <h4 class="modal-title">
          <span data-model="action">Report</span>
        </h4>
      </div>
      <%= form_for [@reportable,@report] do |f| %>
      <div class="modal-body">
          <div class="pbt5">
            <%= f.text_area :content,row:3, class: "form-control",placeholder: "report more" %>
          </div>
      </div>
      <div class="modal-footer">
        <button class="btn btn-default" data-dismiss="modal" type="button">Close</button>
        <%= f.submit "report",class:"btn btn-primary" %>
      </div>
        <% end %>
    </div>
    <!-- /.modal-content -->
  </div>
  <!-- /.modal-dialog -->
</div>

If the report url in comment such as:

/questions/6/comments/15/reports/new

I get the error:

Processing by ReportsController#new as JS
  Parameters: {"question_id"=>"6", "comment_id"=>"15"}
  User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  Question Load (0.2ms)  SELECT  `questions`.* FROM `questions` WHERE `questions`.`id` = 10 LIMIT 1
  Comment Load (0.2ms)  SELECT  `comments`.* FROM `comments` WHERE `comments`.`commentable_id` = 6 AND `comments`.`commentable_type` = 'Question' AND `comments`.`id` = 15 LIMIT 1
  Rendering reports/new.js.erb
  Rendered reports/_reports.html.erb (24.4ms)
  Rendered reports/new.js.erb (25.8ms)
Completed 500 Internal Server Error in 38ms (ActiveRecord: 0.7ms)

NoMethodError - undefined method `comment_reports_path' for #<#<Class:0x00007fb020559858>:0x00007fb022d02c38>
Did you mean?  comment_like_tag:
  app/views/reports/_reports.html.erb:13:in `_app_views_reports__reports_html_erb___1071799134587169621_70197237478960'
  app/views/reports/new.js.erb:1:in `_app_views_reports_new_js_erb___4579025611719430071_70197237521140'

I think maybe I had a erro in set_reportable in set_reportable in reports_controller.rb , If it is , how can I get the right report url?

Thanks so much!

NoMethodError - undefined method `comment_reports_path' for

Your comments and reports both are nested under questions , so you need to change

<%= form_for [@reportable,@report] do |f| %>

to

<%= form_for [@question,@reportable,@report] do |f| %>

Your comments path is nested under your questions path.

resources :questions do
  resources :comments do 
    resources :reports
end

But your form does not provide the question instance to build the URL:

<%= form_for [@reportable,@report] do |f| %>

This [@reportable, @report] expands to comment_reports_path , which does not exist.

You need to pass the question instance as well: [@question, @reportable, @report] , which would expand to question_comment_reports_path .

If you run rake routes (in Rails 5 it might be rails routes , not sure), you should see a list of all your routes and their paths. It makes it easier to reason about existing routes and the arguments they require.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM