2016-07-24 69 views
-2

我从Heroku的收到下面的错误日志,当我参观photos/show.html.erb观点:编辑... ::的ActionView ::模板错误(没有路由匹配...缺少必需的键:[:COMMENT_ID])

ActionView::Template::Error (No route matches {:action=>"index", :comment_id=>nil, :controller=>"cflags", :photo_id=>"100"} missing required keys: [:comment_id])

我有非常基本的PhotoComment模型,正常工作,然后我建立了Cflag模型,用于标记注释。我使用@photo.comments列出了photos/show.html.erb视图中的注释。

显示:

# photos/show.html.erb 

<% @photo.comments.each do |comment| %> 
    <%= form_for(comment, url: photo_comment_cflags_path(@photo, comment)) do |f| %> 
    <%= f.hidden_field :user_id, value: current_user.id %> 
    <%= f.submit "Report Inappropiate" %> 
    <% end %> 
<% end %> 

CFLAGS控制器:

class CflagsController < ApplicationController 
before_action :logged_in_user 

def new 
end 

def create 
    @comment = Comment.find(params[:comment_id]) 
    @cflag = @comment.cflags.build(cflag_params) 
    if @cflag.save 
     if @comment.cflags_count > 1 
     @comment.update_attribute(:approved, false) 
     flash[:success] = "Flag created! Comment ##{@comment.id} has been removed for review. Thank you for your feedback" 
     redirect_to :back 
     else  
     flash[:success] = "Flag created! Thank you for your feedback" 
     redirect_to :back 
     end 
    else 
     redirect_to :back, notice: @cflag.errors.full_messages 
    end  
    end  

    private 
    def cflag_params 
     params.require(:cflag).permit(:user_id, :comment_id).merge(user_id: current_user.id) 
    end 
end 

路线:

resources :photos do 
    resources :comments, only: [:create, :edit, :destroy] do 
    resources :cflags, only: :create 
    end 
end 

Rails的路线:

photo_comment_cflags GET  /photos/:photo_id/comments/:comment_id/cflags(.:format)   cflags#index 
         POST  /photos/:photo_id/comments/:comment_id/cflags(.:format)   cflags#create 
new_photo_comment_cflag GET  /photos/:photo_id/comments/:comment_id/cflags/new(.:format)  cflags#new 
edit_photo_comment_cflag GET  /photos/:photo_id/comments/:comment_id/cflags/:id/edit(.:format) cflags#edit 
    photo_comment_cflag GET  /photos/:photo_id/comments/:comment_id/cflags/:id(.:format)  cflags#show 
         PATCH  /photos/:photo_id/comments/:comment_id/cflags/:id(.:format)  cflags#update 
         PUT  /photos/:photo_id/comments/:comment_id/cflags/:id(.:format)  cflags#update 
         DELETE  /photos/:photo_id/comments/:comment_id/cflags/:id(.:format)  cflags#destroy 

照片控制器:

def show 
    @photo = Photo.approved.find(params[:id]) 
end 

评论控制器:

def create 
    @photo = Photo.find(params[:photo_id]) 
    @comment = @photo.comments.build(comment_params) 
    @comment.save 
    respond_to do |format| 
    format.html { redirect_to :back } 
    format.js 
    end 
end 

CFLAG型号:

class Cflag < ActiveRecord::Base 
    belongs_to :comment, counter_cache: true 
    belongs_to :user, counter_cache: true 
    validates :user_id, presence: true 
    validates :comment_id, presence: true 
    validates :user_id, uniqueness: { 
    scope: [:comment_id], 
    message: 'You can only flag a comment once. Thank you for your feedback.' 
    } 
    default_scope -> { order(created_at: :desc) } 
end 

模式:

create_table "cflags", force: :cascade do |t| 
    t.integer "comment_id" 
    t.integer "user_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

add_index "cflags", ["comment_id"], name: "index_cflags_on_comment_id" 
add_index "cflags", ["user_id"], name: "index_cflags_on_user_id" 

在Heroku的控制台

p = Photo.find(100) 
p.comments = => #<ActiveRecord::Associations::CollectionProxy [#<Comment id: 309, content: "hi", photo_id: 100, user_id: 1, created_at: "2016-07-24 04:43:17", updated_at: "2016-07-24 04:43:17", approved: true, cflags_count: nil> 
+0

嗨,如果注释是在展示页面已报告会发生什么? – sahil

+0

嗯,我还没有得到页面加载的形式,但如果它确实加载和一个cflag已经存在,那么它会触发:'else redirect_to:回来,注意:@ cflag.errors.full_messages'由于唯一性范围在模型中:'validates:user_id,唯一性:{0} {0} {scope:[:comment_id],' –

回答

1

变更表单动作此, 更新

<% if @photo.comments.any? %> 
    <% @photo.comments.each do |comment| %>  
    # you do not have to use comment in form_for, because this form is for creating cflag 
    <%= form_for(:cflag, url: photo_comment_cflags_path(@photo, comment), method: "post") do |f| %> 
      <%= f.hidden_field :user_id, value: current_user.id %> 
      <%= f.submit "Report Inappropiate" %> 
    <% end %> 
    <% end %> 
<% end %> 
+0

Till现在您正在使用索引操作而不是创建操作,因为** photo_comment_cflags **代表索引操作(注意额外的** s会更改整个含义)。 – sahil

+0

我得到以下错误:'ActionView :: Template :: Error(未定义的方法photo_comment_cflag_path'。但是,将其更改为'photo_comment_cflags_path'使其工作。我已将cflag路由设置为'only:create'。 ,因为我试着使用相同的代码Cflag.new和@cflag,我猜''cflag'实际上是代码工作/不工作的区别 –

+0

你能在我的代码中提到的url预先加上'new_'吗? – sahil

0

你的第一个参数是数组,试试这个:

<%= form_for(comment, url: photo_comment_cflags_path(@photo, comment)) do |f| %> 
+0

我得到以下错误代码:ActionView :: Template :: Error(No route matches {:action =>“index” ,::comment_id => nil,:controller =>“cflags”,:photo_id =>“100”}缺少必需的键:[:comment_id]):' –

1

由于每Rails documentation,form_for方法预期的参数是(record, options = {}, &block)

form_for(record, options = {}, &block)public

Creates a form that allows the user to create or update the attributes of a specific model object.

The method can be used in several slightly different ways, depending on how much you wish to rely on Rails to infer automatically from the model how the form should be constructed. For a generic model object, a form can be created by passing form_for a string or symbol representing the object we are concerned with:

所以,你可能想要删除您在form_for方法插入额外的[],它应该是这样的:

<% @photo.comments.each do |comment| %> 
    <%= form_for(Cflag.new, url: photo_comment_cflags_path(@photo, comment)) do |f| %> 
    <%= f.hidden_field :user_id, value: current_user.id %> 
    <%= f.submit "Report Inappropiate" %> 
    <% end %> 
<% end %> 

我建议你试试这样,看看它是否解决了您当前的问题。

+0

我得到以下错误代码:ActionView :: Template ::错误(无路线匹配{:action =>“index”,:comment_id => nil,:controller =>“cflags”,:photo_id =>“100”}缺少必需的键:[:comment_id]):' –

+0

@TimmyVonHeiss ,我已经更新了我的答案。从表单中你需要一个新的'Cflag'而不是一个评论吗? – Lahiru

+0

我仍然收到相同的错误:ActionView :: Template :: Error(无路由匹配{:action =>“index”,:comment_id => nil,:controller =>“cflags”,:photo_id =>“100 “}缺少必需的键:[:comment_id]):' –

相关问题