2012-04-11 4 views
0

Я пытаюсь обновить одно поле нескольких записей в модели Lead. Каждый вывод отображается в строке таблицы, и поле, которое изменяется для нескольких строк, «выбрано», которое является логическим, сохраняется как tinyint 1 или 0, true или false.Rails - Как обновить несколько записей через форму из действия списка?

leads_controller.rb

def list 
    @leads = Lead.where({:store_number => session[:store_number]}).order("selected DESC") 
    @targeted_leads = Lead.where(:store_number => session[:store_number], :selected => true) 
    end 

    def update_multiple 
    @leads = Lead.find(params[:lead_ids]) 
    @leads.update(params[:lead_ids]) 
    redirect_to(:action => 'list') 
    end 

list.html.erb

<%= form_tag update_multiple_leads_path, :method => :put do %> 
<table> 
    <thead> 
    <tr> 
     <th>Lead Name</th> 
     <th>Selected Leads</th> 
    </tr> 
    </thead> 
    <tbody> 
    <% for lead in @leads %> 
    <tr> 
     </td> 
     <td><%= lead.company_name %></td> 
     <td> 
     <%= fields_for("lead_ids[]", lead) do |f| %> 
      <%= f.check_box("selected") %> 
     <% end %> 
     </td> 
    </tr> 
    <% end %> 
    </tbody> 
</table> 
<%= submit_tag('Save Targeted Leads', :class => "btn") %> 
<% end %> 

Теперь, что я хочу эту форму, чтобы сделать, это пройти все проходит через, и если флажок установлен, обновление это «выбранное» поле записи в 1, и если он снят, обновите поле до 0.

Когда он проходит долго, вот результаты по действию update_multiple:

ArgumentError in LeadsController#update_multiple 

Unknown key: 6 
Rails.root: (my/rails/root) 

Application Trace | Framework Trace | Full Trace 
app/controllers/leads_controller.rb:73:in `update_multiple' 
Request 

Parameters: 

{"commit"=>"Save Targeted Leads", 
"lead_ids"=>{"6"=>{"selected"=>"1"}, 
"1"=>{"selected"=>"0"}, 
"3"=>{"selected"=>"0"}}, 
"authenticity_token"=>"ALYtIkJNsAANsHXaAvgeb84G9Ms7OPSkyFO6jkM19yU=", 
"_method"=>"put", 
"utf8"=>"\342\234\223"} 

FYI: (строка 73 ссылок эта строка в мой контроллер: @leads = Lead.find(params[:lead_ids])) Когда я смотрю на это, похоже, он проходит все вместе, так же, как я 'd хочу, чтобы это ... Lead Model, взять id 6, установить выбранный в 1. Теперь возьмите id 1, установите выбранное значение 0. Что действительно меня смущает, так это бит «Неизвестный ключ». Мои первоначальные мысли состоят в том, что они не ищут подходящего поля для изменения ... как, он знает, что я ищу «6», но как насчет «6»? «6» не является ключом. Id 6 или что-то еще? Кто-нибудь еще решил это? Заранее благодарю за ваши мысли.

ответ

0

Выяснил это! Я провел несколько дней (я довольно новичок в рубине), но у меня есть что-то для работы. Это будет работать только в данном конкретном случае, потому что это не гибкая ... Rails, вероятно, имеет лучший способ сделать это, но и для других, которые stuggling:

def update_multiple 
    params[:lead_ids].each do |lead| 
     record = Lead.find(lead[0]) 
     record.update_attributes(lead[1[0]], lead[1[1]]) 
    end 

    redirect_to(:action => 'index') 
    end 

Следует отметить, что в отношении к предыдущему комментарию, это не имеет значения (по крайней мере для моих целей), что id встречается как строка, поэтому нет необходимости в хеше ... но если вы хотите это сделать, я написал это во время отладки.

the_hash = Hash[params[:lead_ids].map {|key, array| [key.to_i, array]}] 

Затем передать хэш, чтобы в каждом цикле, так что ...

the_hash.each do |lead| 

Это вручную цикл по каждому парам и назначая на основе индекса. Поэтому для каждого идентификатора (например, 1) он берет первый индекс этого массива id и вручную назначает его второму индексу того же массива.

Опять же, не очень Rails-like, и определенно не способ сделать это, но он работает. Любой, у кого есть лучший способ, не стесняйтесь вносить свой вклад.

0

Возможно, вам нужно пройти каждый ключ до #to_i? Все параметры возвращаются в виде строк. #find (возможно) требуется целое число для каждого идентификатора.

+0

Держу пари, ты на месте ... http://stackoverflow.com/questions/8877737/recursively-convert-all-numeric-strings-to-integers-in-a-ruby-hash Это решение поможет решить мою проблему, но я не вижу fixnumify в любом месте документации Ruby, а при определении fixnumify он вызывает этот метод изнутри ...? Любая идея, как это сделать?Я хочу преобразовать все числовые строки в хеш в целые числа. – DerektheDev

+0

Пожалуйста, см. Выше ... новый для переполнения стека, не понимал, что не уведомляет вас. – DerektheDev

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