2011-03-19 2 views
0

Я вымотал форму из-за некоторых странностей в моем коде и маршрутах. Вещи работают для добавления данных в базу данных, но я не могу понять, как обновлять данные. Вот какой код.update_attributes с нетрадиционной формой

new.html.erb

<% form_tag '/list' do %> 
    Episodes Completed: 
    <%= text_field_tag "completed" %> 
    Watch Status 
    <%= collection_select(nil, 'id', @show_status, :id, :state) %> 
    <%= hidden_field_tag('show_id', @show.id) %> 
    <%= submit_tag 'Add' %> 
<% end %> 

edit.html.erb

<% form_tag("/list/#{@show_completion.show.id}", :method => :put) do %> 
    Episodes Completed: 
    <%= text_field_tag "completed", @show_completion.episodes_completed %> 
    Watch Status 
    <%= collection_select(nil, 'id', @show_status, :id, :state) %> 
    <%= hidden_field_tag('show_id', @show_completion.show.id) %> 
    <%= submit_tag 'Edit' %> 
<% end %> 

Вот контроллера, создание и обновление методов

def create 
    @show_completetion = ShowCompletionStatus.new 
    @show_completetion.user_id = current_user.id 
    @show_completetion.episodes_completed = params[:completed] 
    @show_completetion.status_state_id = params[:id] 
    @show_completetion.show_id = params[:show_id] 
    @show_completetion.save 
end 

def update 
    @show_completion = ShowCompletionStatus.find(params[:id]) 

    @show_completion.episodes_completed = params[:completed] 
    @show_completion.status_state_id = params[:id] 
    @show_completion.show_id = params[:show_id] 

    if @show_completion.update_attribute('episodes_completed', params[:completed]) 
    redirect_to "/list/#{current_user.username}" 
    else 
    redirect_to "/list/#{params[:id]}/edit" 
    end 
end 

Вот мои маршруты для них:

match "list/" => "list#create", :via => :post 
match "list/new/:show_id" => "list#new", :constraints => { :show_id => /[0-9]+/ } 
match "list/:id/edit" => "list#edit", :constraints => { :id => /[0-9]+/ }, :via => :get 
match "list/:id" => "list#update", :constraints => { :id => /[0-9]+/ }, :via => :put 

Я пробовал разные вещи, чтобы заставить это работать в течение большей части 4 часов. Я думаю, что я просто что-то пропустил, но я просто не вижу этого.

Есть ли лучший способ сделать форму, которая заставляет ее работать лучше?

Любая помощь приветствуется.

ответ

0

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

+0

Поскольку вы уже назначаете атрибуты напрямую, вам не нужен вызов 'update_attributes', просто вызовите' save! '. –

+0

Как я оставил в комментарии на другом. Каждый раз, когда я делал это, он вставлял новую запись и не обновлял старую запись. Я попробовал это несколько раз, чтобы убедиться, что это происходит. Я продолжал менять одно поле примерно в 10 раз, и у меня было 10 новых записей в db. – percent20

0

Попробуйте заменить ваш update_attribute звонок для звонка save.

Кроме того, если вы пишете все с нуля, а не с помощью встроенных команд, попробуйте использовать save! вместо save: это вызовет исключение, если это не удается, в отличие от обычного save, что просто возвращает false.

+0

Проблема, с которой я столкнулся, заключалась в создании новой записи каждый раз, вместо редактирования старой. – percent20

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