Rails How to set multiple polymorphic in controller?
Some of codes as follows:
has_many :comments, :as => :commentable, :dependent => :destroy
belongs_to :commentable, polymorphic: true
has_many :reports, :as => :reportable, :dependent => :destroy
belongs_to :reportable, polymorphic: true
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 %>
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
$("body").append("<%= j render "reports/reports" %>")
$("#tip-offs").modal('show')
<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">×</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>
/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.