2015-08-29 59 views
0

我越來越路線錯誤的URL

::的ActionView ::模板錯誤(沒有路由匹配{:動作=> 「to_approve」:控制器=> 「微柱」:ID => nil}缺少必需的密鑰:[:id]):

沒有路由匹配{:action =>「to_approve」,:controller =>「microposts」, :id => nil}缺少必需的鍵:[:id ]

但它沒有意義,因爲我路由到不同的路線

route.rb

match '/microposts/:id/approve', to: 'microposts#to_approve' , via: [:get, :post], as: 'approve_micropost' 
    match '/microposts/to_approve', to: 'microposts#approve' , via: :get 

controller.rb

def show 
    @tag = Tag.find(params[:id]) 
    @microposts = @tag.microposts 
end 

show.html.rb

<%= render @microposts %> 

_micropost.html.rb - 這裏是線它顯示的錯誤on

<% if is_an_admin? %> 
    <%= link_to "Approve", approve_micropost_path(micropost.id) %> 
    <% end %> 

micropost_controller.rb

def approve 
    @microposts = Micropost.unapproved 
    end 

    def to_approve 
    micropost = Micropost.unapproved_by_id(params[:id]) 
    if micropost.update_attributes(approved: true) 
     flash[:success] = "Approved!" 
    else 
     flash[:error] = "Not approved!" 
    end 

    redirect_back_or microposts_to_approve_path 
    end 

micropost.rb

default_scope { where(approved: true).order('microposts.created_at DESC')} 

    def self.unapproved 
    self.unscoped.all.where(approved: false).order('microposts.created_at DESC') 
    end 

    def self.unapproved_by_id(id = nil) 
    self.unscoped.all.where(id: id) 
    end 

你可以看到它試圖創建microposts_to_approve_path:id這顯然是不存在的,但我寫approve_micropost_path

我錯過了什麼?

此外,在microposts_to_approve_path路線我允許[:get, :post]雖然我只希望允許通過on_click事件訪問to_approve方法(POST?),並沒有看法吧。我應該如何改寫呢?

rake routes

 microposts POST  /microposts(.:format)    microposts#create 
     micropost DELETE /microposts/:id(.:format)   microposts#destroy 
approve_micropost GET|POST /microposts/:id/approve(.:format) microposts#to_approve 
microposts_to_approve GET  /microposts/to_approve(.:format) microposts#approve 

上的錯誤頁面,參數:

Request 

Parameters: 

{"id"=>"4", 
"name"=>"tag name"} 

解決方案

問題是因爲我使用default_scope,比對象的我與之合作並不行。

修復

@microposts = @tag.microposts  #@microposts is CollectionProxy 

之前

@microposts = @tag.microposts.all #@microposts is AssociationRelation 

一旦我改變.all問題得到解決之後。

順便說一句,這是一個錯誤?在我的預計default_scope不應該改變默認行爲。

+0

顯示你'耙routes'導致 – Prashant4224

+0

請出示您的參數。 – thedanotto

回答

0

如果您希望它只回復帖子,然後嘗試更改您的鏈接使用方法'後'。

<% if is_an_admin? %> 
    <%= link_to "Approve", approve_micropost_path(micropost.id), method: :post %> 
<% end %> 

相反,如果你想讓它路由到microposts#to_approve上一個get,然後讓你的鏈接顯式調用get。

<% if is_an_admin? %> 
    <%= link_to "Approve", approve_micropost_path(micropost.id), method: :get %> 
<% end %> 

然後,您應該使用POST路由到microposts#to_approve。但是,由於您允許執行任何操作,因此請確保在您的to_approve操作中,您必須檢查請求類型。如:

#microposts controller 

def to_approve 
    if request.post? 
    # Do post related things 
    else 
    # Do get related things 
    end 
end 
使用的 approve URL的 to_approve行動,並使用在 to_approve網址 approve動作是混亂的,事情

旁註***你可能會忘記爲什麼 - 你 - 做 - 什麼,你做當你在6個月後查看代碼時。

編輯

另一種可能是掰開路線這樣你就不會調用您的控制器的if聲明。

route.rb

post '/microposts/:id/approve', to: 'microposts#approve', as: 'approve_micropost' 
get '/microposts/:id/to_approval', to: 'microposts#to_approve', as: 'micropost_approvals' 
resources :microposts 
+0

那是什麼讓我想到如果我需要在這裏重構其他東西。但是,這是我的方式,但如果你有一個建議,歡迎你寫它;)另外請注意這裏,你只討論第二個問題,而不是第一個(錯誤) – Nir

+0

啊,我測試了你的代碼和對我來說,它取決於你的路線在route.rb中的位置。路線從上到下進行處理,因此您需要確保您的匹配線在您的資源之上:microposts線。此外,在鏈接本身中添加'方法'會強制它正常運行,而不是錯誤。 – trh

+0

我把這個匹配放在資源之前,我已經把'method::post'放到'link_to',但是仍然是一樣的錯誤。你還可以清楚你在編輯中寫的是什麼,我沒有遵循,如果在我的控制器中沒有。 – Nir