AdilA
@AdilA
Нравится кодить, изучаю go c echo

Как в rails определить nested атрибуты?

Никак не дойдет до меня как определить в контроллере nested атрибуты или использовать в одной форме два контроллера если такое возможно (было бы круто)
Что мне нужно: При создании модели Post если юзер не авторизован, регистрировать или аутефицировать его? и создавать модель User, а также отправлять подписчикам письмо о создании нового Post.
Как сейчас всё
сама форма:
views/posts/new.html.erb
<% resourse.posts.build %>
    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
      <%= devise_error_messages! %>
        <%= f.email_field :email, placeholder: "E-mail" %>
        <%= f.password_field :password, placeholder: "password" %>
        <%= f.password_field :password_confirmation, placeholder: "password confirmation" %>
           <%= f.fields_for :posts do |form| %>
           <%= form.text_field :title %>
           <%= form.text_field :content %>
      <%= f.submit "Sign up and create post" %>
    <% end %>
    <%= render "devise/shared/links" %>


User.rb

class User < ActiveRecord::Base
  has_many :posts
  accepts_nested_attributes_for :posts
end


class RegistrationsController < Devise::RegistrationsController 

  def new
    super
  end

  def create
    super
#вот тут я не что делать как определить nested_attributes для posts
  end

Сейчас всё работает, сохраняется и так далее, но я не знаю как отправить письмо и как манипулировать с nested данными, поделитесь опытом о ВЕЛИКИЕ!
  • Вопрос задан
  • 2380 просмотров
Решения вопроса 1
AdilA
@AdilA Автор вопроса
Нравится кодить, изучаю go c echo
Сделал так может кому пригодится
Запилил свой RegistrationController который ссылается на Devise
ну и если у кого нить больше nested attribustes (у меня один)
соответственно post = resourse.posts.second и так далее
class RegistrationsController < Devise::RegistrationsController

def create
    build_resource(sign_up_params)
    resource_saved = resource.save
    yield resource if block_given?
    if resource_saved
    	if resource.posts.present?
    		post = resource.posts.first
    		flash[:success] = "Поздравляем Ваше сообщение опубликованно!"
    		User.includes(:categories, :roles).references(:categories, :roles).where(categories: {id: post.category_id}, roles: { id: 4 }).pluck(:email).each do |email|
				PostsMailer.delay.deliver_posts_register(email, post)
			end
    	end
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      @validatable = devise_mapping.validatable?
      if @validatable
        @minimum_password_length = resource_class.password_length.min
      end
      respond_with resource
    end
  end
end
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
MpaK999
@MpaK999
Буду!
1. Как отправлять письмо - guides.rubyonrails.org/action_mailer_basics.html

2. Для проверок есть всяческие callback методы, например
after_create do |post|
  post.user.nil?
end
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы