принимает вложенные атрибуты с 2 вложенными таблицами


Я новичок в Ruby on rails и создаю простой веб-сайт. Я обнаружил, что рельсы 3 используют attr_accessible, а рельсы 4 используют strong parameters. В настоящее время я работаю с rails 4. Я не совсем уверен, как настроить accepts_nested_attributes_for.

Вот что у меня есть

Модель пользователя:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :rememberable, :validatable

  has_many :expense_pictures 
  has_many :income_pictures

  accepts_nested_attributes_for: ExpensePicture ?
  accepts_nested_attributes_for: IncomePicture ?
end

Модель расходов:

class ExpensePicture < ActiveRecord::Base
  belongs_to :user
  mount_uploader :image, ImageUploader
end

Модель ExpenseText:

class ExpenseText < ActiveRecord::Base
  belongs_to :expense_pictures
end

Модель IncomePicture:

class IncomePicture < ActiveRecord::Base
  belongs_to :user
  mount_uploader :image, ImageUploader
end

Модель IncomeText:

class IncomeText < ActiveRecord::Base
  belongs_to :income_pictures
end

Мой пользовательский контроллер

class UserController < ApplicationController

  def create
    User.create(user_params)
    accepts_nested_attributes_for :IncomePicture ?
    accepts_nested_attributes_for :ExpensePicture ?
  end

  private

    def user_params
      # required input for params
      # permit - returns a version of the params hash with ony the permitted attributes
      params.require(:user).permit(:name, :email, :password, :password_confirmation, ...not sure...)
    end

Конец

1 2

1 ответ:

Используя accepts_nested_attributes_for для has_many relation с вашими моделями, Ваша User модель должна выглядеть следующим образом

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :rememberable, :validatable

  has_many :expense_pictures 
  has_many :income_pictures

  accepts_nested_attributes_for :expense_pictures 
  accepts_nested_attributes_for :income_pictures
end

Ваши new и create методы usercontroller должны выглядеть следующим образом

def new
@user = User.new
@user.expense_pictures.build
@user.income_pictures.build
end

def create
@user = User.new(user_params)
 if @user.save
 redirect_to @user
 else 
 render 'new'
 end
end

И ваш user_params метод должен выглядеть примерно так

def user_params
   params.require(:user).permit(:name, :email, :password, :password_confirmation, expense_pictures_attributes: [:your_attr1,:your_attr2,..],income_pictures_attributes: [:your_attr1,:your_attr2,..])
end

Не стесняйтесь спрашивать, хотите ли вы получить дополнительную информацию по этому вопросу.