2016-06-17 2 views
0

Попытка отследить an issue обновление записи, и пришел к этому блоку:Контроллер Rails: где указано @ foo.update?

# PATCH/PUT /artefacts/1 
# PATCH/PUT /artefacts/1.json 
def update 
    respond_to do |format| 
    if @artefact.update(artefact_params) 
     format.html { redirect_to @artefact, notice: 'Artefact was successfully updated.' } 
     format.json { render :show, status: :ok, location: @artefact } 
    else 
     format.html { render :edit } 
     format.json { render json: @artefact.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Теперь для меня это выглядит как определение update проверяет себя, но это не может быть правдой, так как там нет код для разбора artefact_params.

Что мне не хватает? Где код, который анализирует параметры и сохраняет запись?

(с использованием Rails 5.0rc1)

+0

вы просите, чтобы увидеть [Rails исходный код] (https://github.com/rails/rails) ? Если вы готовы копать, вы можете видеть все, что захотите. – MarsAtomic

+0

Я не знаком с тем, что происходит за кулисами. Я прошу увидеть исходный код рельсов? Это то, где будет храниться определение для '@ artefact.update'? – joshfindit

+0

'update' является частью RESTful API Rails, поэтому да, вот где он будет найден. Представьте, что вы пишете метод, который сохраняет данные на основе набора данных, которые он получает (хеш параметров). Вы отменили бы эти данные в своем методе, а затем вызовите некоторый метод 'save' с этими параметрами unmarshalled в качестве аргументов для сохранения. Для меня это кажется простым, поэтому мне интересно, почему вы задаете этот вопрос (например, у вас есть еще одна проблема, которую вы пытаетесь решить, которая приведет вас в этом несколько окольном направлении). – MarsAtomic

ответ

1

Код вы после можно найти в файле rails/activerecord/lib/active_record/persistence.rb.

Вот соответствующий код:

# Updates the attributes of the model from the passed-in hash and saves the 
# record, all wrapped in a transaction. If the object is invalid, the saving 
# will fail and false will be returned. 
def update(attributes) 
    # The following transaction covers any possible database side-effects of the 
    # attributes assignment. For example, setting the IDs of a child collection. 
    with_transaction_returning_status do 
    assign_attributes(attributes) 
    save 
    end 
end 

И от rails/activemodel/lib/active_model/attribute_assignment.rb

def assign_attributes(new_attributes) 
    if !new_attributes.respond_to?(:stringify_keys) 
    raise ArgumentError, "When assigning attributes, you must pass a hash as an argument." 
    end 
    return if new_attributes.nil? || new_attributes.empty? 

    attributes = new_attributes.stringify_keys 
    _assign_attributes(sanitize_for_mass_assignment(attributes)) 
end 

private 

def _assign_attributes(attributes) 
    attributes.each do |k, v| 
    _assign_attribute(k, v) 
    end 
end 

def _assign_attribute(k, v) 
    if respond_to?("#{k}=") 
    public_send("#{k}=", v) 
    else 
    raise UnknownAttributeError.new(self, k) 
    end 
end 
Смежные вопросы