При попытке создать ссылку для редактирования для моей панели администратора. У меня эта ошибка ... No route matches {:action=>"edit", :controller=>"admin/progresses"} missing required keys: [:id] Не могли бы вы объяснить мне, что случилось?

Вот мой rake routes:

 admin GET    /admin(.:format)                         admin/dashboard#index
         admin_progresses GET    /admin/progresses(.:format)              admin/progresses#index
                          POST   /admin/progresses(.:format)              admin/progresses#create
       new_admin_progress GET    /admin/progresses/new(.:format)          admin/progresses#new
      edit_admin_progress GET    /admin/progresses/:id/edit(.:format)     admin/progresses#edit
           admin_progress GET    /admin/progresses/:id(.:format)          admin/progresses#show
                          PATCH  /admin/progresses/:id(.:format)          admin/progresses#update
                          PUT    /admin/progresses/:id(.:format)          admin/progresses#update
                          DELETE /admin/progresses/:id(.:format)          admin/progresses#destroy

Это мои просмотры / admin / progresses / index.html.slim

.container
  .row
    h2 Pepito's Dashboard
    br
    = link_to "New article", new_admin_progress_path, class:'btn btn-success'
    br
    br
    
    .dashboard
      - @progresses.each do |progress|
        .row 

          .col-xs-2
            h4
            = progress.title.capitalize
          .col-xs-2
            h4
            = progress.date
          .col-xs-5
            h4  
            = truncate(progress.content, length: 90)
          .col-xs-1
            = link_to 'View', progresses_path, class:'btn btn-success'
          .col-xs-1
            = link_to 'Edit', edit_admin_progress_path(@progress), class:'btn btn-primary'
          .col-xs-1
            = link_to 'Destroy', "#", class:'btn btn-danger', method: :delete
        hr
      

Это мой admin / progresses_controller.rb:

  class Admin::ProgressesController < Admin::ApplicationController

    def index
      @progresses = Progress.all
    end

    def new
      @progress = Progress.new
    end

    def show
      @progress = Progress.find(params[:id])

    end

    def create
       @progress = Progress.new(progress_params)

       respond_to do |format|
         if @progress.save
           unless params[:progress_attachments].nil?
             params[:progress_attachments]['image'].each do |a|
               @progress_attachment = @progress.progress_attachments.create!(:image => a)
             end
           end
           format.html { redirect_to admin_progresses_path, notice: 'Progress was successfully created.' }
         else
           format.html { render action: 'new' }
         end
       end

     end

     def edit
       @progress = Progress.find(params[:id])
     end

     def destroy
        @progress = Progress.find(params[:id])
     end

     def update
      @progress = Progress.find(params[:id])
        if @progress.update(params[:progress].permit(:title, :date, :content, :main_image, progress_attachments_attributes: [:id, :progress_id, :image]))
          redirect_to progresses_path
        else
      render 'edit'
        end
    end


     private

     def progress_params
        params.require(:progress).permit(:title, :content, :date, :main_image, progress_attachments_attributes: [:id, :progress_id, :image])
     end

  end

Большое спасибо ! :)

Редактировать

Спасибо всем за все ответы!

= link_to 'Edit', edit_admin_progress_path(progress), class:'btn btn-primary' сработало !!

-1
user6124553 7 Сен 2016 в 17:14

5 ответов

Лучший ответ

Попробуйте изменить

= link_to 'Edit', edit_admin_progress_path(@progress), class:'btn btn-primary'

К

= link_to 'Edit', edit_admin_progress_path(progress), class:'btn btn-primary'

Переменная, которую вы хотите использовать, не является переменной экземпляра, это локальная переменная из

@progresses.each do |progress|
2
Stephan Rodemeier 7 Сен 2016 в 14:16

Поскольку вы выполняете цикл @progresses с локальной переменной progress, вы должны передать progress вспомогательному URL-адресу.

= link_to 'Edit', edit_admin_progress_path(@progress), class:'btn btn-primary'

Должно быть

= link_to 'Edit', edit_admin_progress_path(progress), class:'btn btn-primary'
0
Arun Kumar Mohan 7 Сен 2016 в 14:25

Измените @progress на progress

= link_to 'Edit', edit_admin_progress_path(progress), class:'btn btn-primary'

Поскольку вы показываете ссылку edit внутри цикла, у вас нет доступного @progress, но progress

0
Arun Kumar Mohan 7 Сен 2016 в 15:01

Попробуйте опустить '@' перед progress в пути редактирования - в конструкторе форм вы используете progress, чтобы заменить каждый отдельный прогресс в @progresses, поэтому вам не нужно обратитесь к экземпляру @progress в этом конкретном пути:

link_to 'Edit', edit_admin_progress_path(progress), class:'btn btn-primary'

Кроме того, @progress не установлен в вашем индексном представлении, частью которого является эта форма. Тем не менее, вы устанавливаете @progress в режиме редактирования, но это только после того, как вы переходите по ссылке и делаете запрос get.

Пожалуйста, дайте мне знать, если это не сработает!

0
inveterateliterate 7 Сен 2016 в 16:15

Изменить на

edit_admin_progress_path(progress)

@progress - это переменная экземпляра, и это просто nil без ошибок, если не установлено

0
Vasfed 7 Сен 2016 в 14:17