Передача параметров для обновления вложенных атрибутов - PullRequest
3 голосов
/ 09 ноября 2011

Я работаю над очень простым практическим приложением, где пользователь может создавать несколько цитат.Проблема в том, что я не могу обновить свои цитаты.У меня много вещей, и я прочитал другие вопросы здесь и в Google, но не могу понять, что я делаю неправильно.Вот мой код:

#User Model
    class User < ActiveRecord::Base
      has_many :quotations, :dependent => :destroy
      attr_accessible :quotations
      accepts_nested_attributes_for :quotations, :allow_destroy => true
    end

#Quotations Model
class Quotation < ActiveRecord::Base
  attr_accessible :quote_text, :author, :quote_type, :category, :tags, :user_id
  belongs_to :user
end

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

class QuotationsController < ApplicationController
  before_filter :get_user

  def get_user
    @user = User.find(params[:user_id])
  end 

  def edit
    @quotation = @user.quotations.find(params[:id])
  end

  def update
    @quotation = @user.quotations.find(params[:id]) 
    if @quotation.update_attributes(params[:id])
      redirect_to user_quotation_path :notice  => "Successfully updated quotation."
    else
      render :action => 'edit'
    end
  end    

end

Ответы [ 2 ]

6 голосов
/ 09 ноября 2011

Вы передаете неправильный хэш params в вызов update_attributes.Это должно быть

if @quotation.update_attributes(params[:quotation]).

Чтобы уточнить, передача :id или :quotation не делает ничего особенного. Символы в Ruby являются просто неизменяемой строкой .Таким образом, использование :id или :quotation является эквивалентом передачи строки «id» или «quotation».params[] - это хэш-карта всех параметров формы, опубликованных на вашей странице.

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

Значения идентификатора, контроллера и действия в хэше params получены из значений маршрута из URL.

Например,

params[] = 
{ 
      :controller => 'quotations',
      :action => 'edit',
      :id => '1',
      :quotation => 
      {
          :quote_text=> "Blah", 
          :author=> "Steve", 
          :quote_type=> "1", 
          :user_id=> "6"
      }
}
0 голосов
/ 10 ноября 2011

Хорошо, известный мне разработчик рельсов помог мне точно определить проблему.Чтобы уточнить мой комментарий (поскольку Stackoverflow не позволил мне опубликовать ответ в течение 12 часов после создания вопросов):

@quotation = @user.quotations.find(params[:id]) 

извлекает цитату, которую я хочу отредактировать.Затем:

if @quotation.update_attributes(params[:id])

Обновляет только идентификатор, что означает, что ничего не изменилось, потому что идентификатор отсутствует в форме редактирования.

Правильный код будет передавать params [: quotation] для обновления параметров qoutation.

if @quotation.update_attributes(params[:quotation]) 

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

...