Обновите базу данных, используя «update_attributes» через «has_many» - PullRequest
0 голосов
/ 16 сентября 2011

У меня проблема с получением моего первого приложения (я новичок) для сохранения новой связанной записи.У меня есть две модели (пользователи и изображения) с ассоциацией has_many / own_to.Я настроил userController так, чтобы он мог создавать новую картинку, как показано ниже:

  def new_picture
    @user = User.find(current_user.id)
    @picture = @user.pictures.build
  end

  def create_picture
    @user = User.find(params[:id])
    @picture = @user.pictures.build(params[:picture])
    if @picture.save
      flash[:notice] = "Your picture was successfully added."
      redirect_to :action => 'show', :id => @user.id
    else
      render :template => "new_picture"
    end
  end

, и я использую

<%= link_to("add picture", :action => 'new_picture', :id => @user.id) if current_user %>

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

  def edit_picture
    @user = User.find(current_user.id)
    @picture = @user.pictures.find(params[:id])
  end
  # When the user clicks the save button update record

  def update_picture
    @user = User.find(current_user.id)
    @picture = @user.pictures.find(params[:picture])
    respond_to do |format|
      if @picture.update_attributes(params[:picture])
        flash[:notice] = "Your picture was successfully updated."
        redirect_to :action => 'show', :id => @user.id
      else
        render :template => "new_picture"
      end
    end
  end

и добавил ссылку на редактирование в show.erb:

<%= link_to("edit picture", :action => 'edit_picture', :id => picture.id) if current_user %>

Он отлично загружает форму редактирования, с данными вправильное место, но при сохранении все, что он делает, дает мне ошибку 'ArgumentError in UsersController # update_picture' с кучей неизвестных ключей из моей таблицы изображений.

Может кто-нибудь объяснить, почему?Я чувствую, что есть одна часть головоломки, которую я не совсем понял здесь ...

Заранее спасибо!

ОБНОВЛЕНИЕ: Просмотр кода выглядит следующим образом:

<h1>New picture for <%= @user.name %></h1>
<% form_for :picture, @picture, :html => { :multipart => true }, :url => {:action => 'update_picture', :id => @user.id} do |f| %>

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Не могу увидеть вашу проблему в коде представления, однако вы можете сделать то же самое более элегантно (RESTful), как вложенный маршрут. Таким образом, вы сможете увидеть проблему более четко.

конфиг / routes.rb:

resources :users do
  member do
    resources :pictures
  end
end

приложение / контроллеры / pictures_controller.rb:

class PicturesController < ApplicationController
  before_filter :find_picture, :only => [:edit, :update]

  def edit
  end

  def update
    if @picture.update_attributes params[:picture]
      flash[:notice] = "Your picture was successfully updated."
      redirect_to user_path(current_user)
    else
      render :edit
    end
  end

  protected
  def find_picture
    @picture = current_user.pictures.find params[:id]
  end
end

приложение / просмотров / фото / edit.html.erb:

<%= form_for [current_user, @picture] do |f| %>
<!-- some stuff -->
<% end %>

и ссылку на форму редактирования:

<%= link_to_if current_user, 'edit picture',
                edit_user_picture_path(:user => current_user, :id => picture) %>
0 голосов
/ 16 сентября 2011

Я предлагаю добавить 'accepts_nested_attributes_for: pictures к модели пользователя, а затем сделать

<%= form_for @user do |form| %>
  .. user fields

  <%= form.fields_for :pictures do |picture_form| %> 

    .. picture fields

  <% end %>

  <%= form.submit %>
<% end %>

в представлении.

Другой вариант - создать новый контроллер для картинок.Это может быть проще.

...