button_to удаленное обновление

Я пытаюсь использовать помощник button_to для удаленного обновления моей базы данных, хотя у меня есть несколько проблем, когда он, похоже, не передает параметры.

на мой взгляд, я использую

- @availabilities.each do |a|
    =button_to 'Accept', { :controller => 'availabilities', :action => :update, :id => a.id, :available => true }, :confirm => 'Are you sure?', :method => :post, :remote => true

и в контроллере

# PUT /availabilities/1


# PUT /availabilities/1.json
  def update
    @availability = Availability.find(params[:id])

    respond_to do |format|
      if @availability.update_attributes(params[:availability])
        format.html { redirect_to @availability, :notice => 'Availability was successfully updated.' }
        format.js
      else
        format.html { render :action => "edit" }
        format.js
      end
    end
  end

консольный вывод

    Started POST "/availabilities/2/edit?available=true" for 127.0.0.1 at 2013-02-25 21:43:30 +1100

ActionController::RoutingError (No route matches [POST] "/availabilities/2/edit"):

person Boss Nass    schedule 25.02.2013    source источник
comment
проблема, похоже, связана с маршрутом, убедитесь, что существует URL-адрес, на который вы отправляете данные, который является контроллером, методом действия и соответствием входных параметров   -  person Dakait    schedule 25.02.2013


Ответы (1)


Похоже, у вас настроены маршруты по умолчанию, которые будут сопоставлять POST с действием создания контроллера и отклонять любые данные POSTed для обновления существующего объекта.

В коде кнопки измените метод на PUT.

=button_to 'Accept', { :controller => 'availabilities', :action => :update, :id => a.id, :available => true }, :confirm => 'Are you sure?', :method => :put, :remote => true

Пример кода после обсуждения комментариев

В помощнике у меня есть следующее, которое отображается в представлении.

def toggle_admin(user)
  if user.is_admin?
    button_to "Yes", toggle_admin_path(user), :id => "toggle_admin_#{user.id}", :class => "btn btn-mini toggle-admin", :remote => true
  else
    button_to "No", toggle_admin_path(user), :id => "toggle_admin_#{user.id}", :class => "btn btn-inverse btn-mini toggle-admin", :remote => true
  end
end

Мой файл маршрутов указывает toggle_admin_path на контроллер пользовательских настроек, который содержит следующее:

def toggle_admin
  @user = User.find(params[:id])
  @account = @user.account
  if @user.is_admin? && @account.admins > 1
    @user.remove_role :admin
  else
    @user.roles << :admin
  end
  if request.xhr?
    render :status => 200, :content_type => 'text/javascript'
  else
    redirect_to edit_account_path
  end
 end
person Robin Fisher    schedule 25.02.2013
comment
метод put кажется хорошим, но он все еще не передает параметры: S - person Boss Nass; 25.02.2013
comment
я получаю (0.2ms) BEGIN Availability Exists (0.6ms) SELECT 1 FROM "availabilities" WHERE ("availabilities"."user_id" = 6 AND "availabilities"."id" != 2 AND "availabilities"."event_id" = 2) LIMIT 1 (0.3ms) COMMIT - person Boss Nass; 25.02.2013
comment
Когда у вас есть объект доступности, что вы пытаетесь с ним сделать? Установить для атрибута available значение true? Ваш контроллер ожидает передачи хэша с именем доступность (update_attributes(params[:availability]), но его не существует. - person Robin Fisher; 25.02.2013
comment
в итоге сделал =button_to 'Accept', { :controller => 'availabilities', :action => :update, :availability => { :available => true }}, :confirm => 'Are you sure?', :method => :put хотя я не думаю, что это идеально - person Boss Nass; 25.02.2013
comment
У меня есть аналогичная схема в одном из моих приложений, которое переключает статус администратора для пользователя. У меня есть отдельный маршрут с именем toggle_admin, который направляется к контроллеру settings. Метод в контроллере выполняет одну работу по переключению статуса администратора человека. Содержимое кнопки затем варьируется в зависимости от того, является ли человек администратором. Я мог бы опубликовать пример кода в своем ответе, если вы хотите пойти по этому пути? - person Robin Fisher; 25.02.2013
comment
просто пытаюсь достичь лучших стандартов кодирования, мой метод кажется немного хакерским, это было бы фантастически, тогда я могу оценить, где я изменился - person Boss Nass; 25.02.2013
comment
Отличный материал. Нет причин, по которым вы не можете использовать это решение и устранить дублирование. - person Robin Fisher; 25.02.2013
comment
использование вашего метода будет менее вероятным для возможной инъекции sql? - person Boss Nass; 25.02.2013