2015-08-29 2 views
0

Я не получаюМаршрут к неправильному URL

ActionView :: Template :: Ошибка (нет соответствующего маршрута {: действие => "to_approve",: контроллер => "microposts",: ИД => 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 - Здесь линия он показывает ошибку на

<% 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] хотя я только хочу, чтобы разрешить доступ к to_approve методу через on_click событий (пост?) И не посмотреть на него .. Как я должен переписать это?

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 и чем объекте I работал с не совсем нормально.

Перед исправлением

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

После

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

После того, как я изменение .all проблема была решена.

BTW, это ошибка?В моем предложении default_scope не следует изменять поведение по умолчанию.

+0

Продемонстрируйте 'грабли routes' результат – Prashant4224

+0

Пожалуйста, покажите ваши параметры. – thedanotto

ответ

0

Если вы хотите, чтобы он отвечал только на сообщение, попробуйте изменить свою ссылку, чтобы использовать метод post.

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

И наоборот, если вы хотите, чтобы маршрут к microposts # to_approve на ГЭТ, а затем сделать вашу ссылку явно вызвать получить.

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

Затем вы должны быть перенаправлены на микропосты # to_approve, используя POST. Однако, поскольку вы разрешаете любое действие, убедитесь, что в вашем действии to_approve вам нужно будет проверить тип запроса. Такие, как:

#microposts controller 

def to_approve 
    if request.post? 
    # Do post related things 
    else 
    # Do get related things 
    end 
end 

Sidenote *** с помощью to_approve действие на approve URL, и используя approve действие на to_approve URL сбивает с толку, что вы можете забыть, почему вы-сделали-то, что вы-сделали когда вы посмотрите на код через 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

А, я проверил ваш код и для меня это зависело от положения ваших маршрутов в маршруте. rb. Маршруты обрабатываются сверху вниз, поэтому вам нужно убедиться, что ваши строки соответствия находятся выше ваших ресурсов: линия микропотоков. Кроме того, добавление «метода» в самой ссылке заставляло его вести себя корректно, а не ошибки. – trh

+0

Я поместил совпадение перед ресурсами, и я поместил 'method:: post' в' link_to', но все равно такую ​​же ошибку. Можете ли вы также очистить то, что вы написали в редактировании, я не последовал, нет, если в моем контроллере. – Nir

Смежные вопросы