1

Я действительно застрял. Есть ли кто-нибудь, кто мог бы помочь? Что я делаю не так? Как создать простую вложенную форму?Как создать простую вложенную регистрационную форму?

У меня есть две модели каждый со своими ресурсами: организации и участники. Организация имеет несколько членов, и член является членом одной организации.

Как создать простую вложенную форму, которая подписывает новую организацию, а также один член для этой организации?

Моя текущая попытка ниже. Новое представление загружается штрафом, но затем при отправке формы я получаю сообщение об ошибке unknown attribute 'org_name' for Member.

Хотя один из способов пойти может быть объектом формы и Activemodel, я бы прежде, чем реализовать такой первый, как он, работать без такового.

Организация модель: модель

has_many :members, dependent: :destroy 
accepts_nested_attributes_for :members, :reject_if => :all_blank, :allow_destroy => true 

Участник:

belongs_to :organization 

организации управления:

def new 
    @organization = Organization.new 
    @member = @organization.members.build 
end 

def create 
    @organization = Organization.new(organizationnew_params) 
    @member = @organization.members.build(organizationnew_params) 
    if @organization.save && @member.save 
    @member.send_activation_email  # Will Rails be able to get to this method? The method exists in multiple models and Rails should here use the version from the Member model. 
    flash[:success] = "Please check your email to activate your account." 
    redirect_to root_url 
    else       
    render 'new' 
    end 
end 

def organizationnew_params 
    params.require(:organization).permit(:org_name, 
             :phone, 
        member_attributes: [:email, 
             :username, 
             :admin, 
             :password, 
             :password_confirmation 
             ]) 
end 

организации новый вид:

<%= form_for(@organization) do |f| %> 
    <%= f.text_field :org_name, %> 
    <%= f.text_field :phone %> 

    <%= f.fields_for :member do |p| %> 
    <%= p.text_field :username %> 
    <%= p.email_field :email %> 
    <%= p.password_field :password %> 
    <%= p.password_field :password_confirmation %> 
    <%= hidden_field_tag :admin, true %> 
    <% end %> 

    <%= f.submit "Sign up", class: "formbutton btn btn-default" %> 
<% end %> 

ответ

2

Вы должны изучить концепцию объектов формы. Вы можете легко реализовать это в Rails с помощью ActiveModel.

class SignupForm 
    include ActiveModel::Model 

    # define your signup form attributes 
    attr_accessor :organization_name, :organization_note, :user_name, :user_fullname, :user_email 

    def save 
    organization = Organization.create(
     organization_name: organization_name, note: organization_note 
    ) 

    user = organisation.users.create(email: user_email, name: user_name, 
     full_name: user_fullname) 

    return true 
    end 
end 

Это не совсем правильная реализация, но вы можете работать отсюда.Вы можете использовать этот объект в качестве нормальной модели в ваших формах:

<%= form_for(@signup_form) do |f| %> 
    <%= f.text_field :organization_name %> 
    <%= f.text_field :user_name %> 
    <%= f.text_Field :user_email %> 
<% end %> 

И в контроллере:

class SignupsController 
    def new 
    @signup_form = SignupForm.new 
    end 

    def create 
    @signup_form = SignupForm.new(params[:signup_form]) 

    if @signup_form.save 
     # success 
    else 
     # display errors 
    end 
    end 
end 

Конечно, вы должны также осуществить некоторые проверки внутри SignupForm и обрабатывать случай, когда проверка не пройдена.

+0

Спасибо, я пытался выполнить ваши шаги, не рефакторинг в отдельный объект формы. Я добавил это как обновление к моему оригинальному сообщению. Если я не ошибаюсь, то использование сильных_парамов аналогично используемому attr_accessor (я не использовал attr_accessor еще нигде в своем приложении, поэтому для согласованности вместо этого используйте сильные_параметры). Фактически, если я добавляю 'attr_accessible: members_attributes' к модели организации, он выдает ошибку' undefined method 'attr_accessible' '. – Nick

+0

Я не буду работать, как вы писали. У вас есть has_many связь, поэтому вы не можете использовать методы для одного ресурса. –

+0

Я изменил это на '@member = @ organization.members.build' – Nick

0

Один чистый способ добраться до «предназначен ситуации» от «текущей ситуации» заключается в использовании обещаний. Сделайте единую операцию, которая связывает ваши (многообещающие) операции записи. Сначала создайте новую организацию. Если ошибок нет, создайте пользователя. То же самое для назначения нового пользователя в качестве администратора для вновь созданной организации.

https://github.com/lgierth/promise.rb

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

Одним из решений для этого было бы иметь форму для конкретной организации, новый пользователь ударяет по форме из ссылки для этой организации или вводит свою организацию и возвращает близкое соответствие организациям, которое они могут иметь в виду (для этого есть API-интерфейсы).

Надеюсь, это даст вам несколько идей.

Если вы в порядке с одной большой формой, просто соедините взгляды. В любом случае вам потребуется новое представление, которое вы упомянули в последнем предложении, так что вы создаете хотя бы одно новое представление.

Смежные вопросы