2016-01-29 4 views
0

Этот процесс обновления что-то другое мне нужно запрос обновления внутри цикла, но показывает эту ошибку:неопределенный метод `update_attributes' в рубине на рельсах

undefined method `update_attributes'

Это код:

<%= link_to "Accept", apply_path(accept:{:accept => 1}), :method => :put, class: "btn btn-success" %> 

Контроллер:

def update 
    @accept = Applied.where(params[:applied_id]) 
    params.permit! 
    if @accept.update_attributes(params[:applied_id]) 
    #flash[:notice] = "updated" 
    render 'apply' 
    else 
    render 'apply' 
    end 
end 

параметры запроса:

{"_method"=>"put", "authenticity_token"=>"Yk26LKrW9ulRVV6p8GWhqTP7coSg96JiAmU4CUYYFugBgTDR2iRZZlyY1SQ7TbA7B2YVmgulgcWTosXvjnPXZw==", "accept"=>{"accept"=>"1"}}

Как я могу найти решение?

+0

свой вопрос неясный е. Что вы хотите с этим AppliedJob? вы находите прикладные задания с идентификаторами, а затем обновляете эти идентификаторы? Также у вас есть ссылка на запрос POST, а обновление по умолчанию PUT/PATCH. –

+0

Я использовал PUT/PATCH, но показывал ошибку –

+0

'where' возвращает отношение, а не экземпляр. Вместо этого вы хотите использовать 'find'. –

ответ

0

Вы выравнивают

@accept = Applied.where(params[:applied_id]) 

возвращает отношение ActiveRecord, который, очевидно, не имеет метод update_attributes. Для извлечения одной записи, используйте first из find вместо:

@accept = Applied.find(params[:applied_id]) 
1

Вы можете назвать update_attributes для одной модели, например (запись) только не для объекта ActiveRecord :: Relation (это как массив записей).

Использование:

@accept = Applied.where({applied_id:params[:applied_id]}).first 

или

@accept = Applied.find(params[:applied_id]) 

Будьте в курсе, найти внешний вид для вашего applied_id в поле идентификатора вашей модели таблицы, если у вас нет другой конфигурации на месте.

И заметьте, что update_attributes потребляет хэш: пар "поле значений" ({field_1_name: field_1_value, field_2_name: field_2_value}) вы хотите обновить, не один только applied_id.

0

Продолжение со страницы comments.

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

apply_path(accept:{:accept => 1, applied_id: YOUR_APPLIED_ID}) 

Update свои действия следующим образом:

def update 
    accept = params[:accept] # Recommendation: you should use strong parameter 
    @accept = Applied.where(accept[:applied_id]) 
    params.permit! 
    @accept.update_attributes(accept) 

    render 'apply' # You don't need any condition, as you are rendering same template in every case. 
end 
+0

Привет @ RAJ 'accept' означает одно имя поля в таблице, мне нужно обновить' 1' в поле 'accept' –

+0

Спасибо @try Однако сожалею о позднем ответе, я думаю, что мой ответ помог вам достичь своей цели. – RAJ

0

Вопрос заключается в том, что вы пытаетесь обновить collection (where), который не имеет метод update_attributes доступны.

Что вам нужно .find:

def update 
    @accept = Applied.find params[:applied_id] 
    @accept.update applied_params 
    render 'apply' 
end 

private 

def applied_params 
    params.require(:accept).permit(:accept) 
end 

Однако, вы не передаете никакого applied_id параметра (так find не будет работать); вам нужно использовать следующий маршрут:

#config/routes.rb 
resources :applied do 
    put :apply, action: :update #-> url.com/applied/:applied_id/apply 
end 

<%= link_to "Accept", apply_path([[[applied.id]]], accept:{:accept => 1}), :method => :put, class: "btn btn-success" %> 

Намного лучше было бы использовать button_to:

<%= button_to "Accept", apply_path([[applied_id]]), method: :put, params: {accept: 1} %> 

Если вы использовали выше, вы должны изменить метод params в контроллере ,

-

Если вы хотите использовать .where (для нескольких записей), вы должны будете использовать update_all:

def update 
    @accept = Applied.where id: params[:applied_id] 
    @accept.update_all applied_params 
    render 'apply' 
end 

private 

def applied_params 
    params.require(:accept).permit(:accept) 
end 
+0

Я использовал ваше предложение '<% = button_to" Accept ", apply_path ([[apply_id]]), method:: put, params: {accept: 1}%>', но показывая 'undefined local variable или method apply_id'. например, у меня есть список, мне нужно обновить '1' в поле' accept' для каждого элемента в списке, просто нажмите 'accept' ind update' 1' –

+0

'[[apply_id]]' мой мойщик, где вы должны вставить ваш '@ apply_id' –

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