Назначение текущего пользователя для нескольких объектов? - PullRequest
2 голосов
/ 11 декабря 2011

В моем коде ниже я хочу назначить текущего пользователя для созданных продуктов.

ProductsController.rb

def new
  @products = Array.new(2) { Product.new }   
end

def create_multiple
  params[:product][:user_id] = current_user.id
  Product.transaction do
    begin
      @products = Product.create!(params[:products].map {|_k, up| up.merge params[:product]})
      redirect_to :back, :notice => "Success!"
    rescue ActiveRecord::Rollback
      redirect_to :back, :notice => "An error occured, please try again."
    end
  end
end

new.html.erb

<%= form_tag create_multiple_products_path, :method => :post do %>

  <%= date_select("product", "purchase_date")  %>

  <% @products.each_with_index do |product, index| %>
     <%= fields_for "products[#{index}]", product do |up| %>
        <%= render "fields", :f => up %>
     <% end %>
  <% end %>

  <%= submit_tag "Done" %>
<% end %>

ID пользователя (текущий пользователь) не назначается.Есть идеи как его назначить?

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Здесь можно устранить большую логику, запомнив два факта: create примет массив хэшей для создания нескольких объектов, а его аналог метода взрыва create! сгенерирует исключение в случае неудачной проверки.

def create_multiple
  # like clyfe said, do this in a transaction
  Product.transaction do
    begin
      @products = current_user.products.create!(
        # Hash#map returns an Array, so no need to use Hash#values
        params[:products].map { |_k, up| up.merge params[:product] }
      )

      # if create! is successful...
      redirect_to :back, :notice => "Success!"

    # if it's not successful it'll throw this exception, which we can rescue
    rescue ActiveRecord::Rollback
      redirect_to :back, :notice => "An error occured, please try again."
    end
  end
end

Один из способов решить проблему create! - просто избавиться от любых «пустых» записей в before_filter, например ::10000

before_filter :toss_blank_products

def toss_blank_products
  params[:products].reject! do |prod|
    # this logic may need to be more complex depending on the meaning of "blank"
    # for your model/form
    prod.values.all? &:blank
  end
end
1 голос
/ 11 декабря 2011
def create_multiple
  @products = params[:products].values.collect do |up|
    Product.new(up.merge(params[:product]).merge(:user_id => current_user.id))
  end

  # should run in a transaction, don't half save!
  Product.transaction do
    @valid = @products.all?(&:save)
  end

  if @valid
    redirect_to :back, :notice => "Success!"
  else
    redirect_to :back, :notice => "An error occured, please try again."
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...