2014-12-17 3 views
0

Я попытался реализовать многие из предложенных решений в соответствующих вопросах, но еще не нашел ответа, идеально подходящего для того, чего я пытаюсь достичь в своем приложении Rails 4.Как правильно связать модель с несколькими моделями?

В основном мое приложение имеет три модели. Пользователи, Крючки (встраиваемые всплывающие окна) и Контакты. Пользователи могут создавать Hooks и Contacts в своем интерфейсе. И любой посетитель может создать новый контакт, заполнив форму «Контакт», размещенную в представлении «Хук», и этот контакт связан с пользователем, создавшим этот крючок.

Это прекрасно работает, однако, когда контакт создается путем заполнения формы крюка, нет никакой связи с конкретной Hook они заполнили форму в.

Следующего набор возможностей, которые я хотел бы добавить к моему Приложение требует не только связывания каждого контакта с пользователем, но и с конкретным Крюком, из которого он был создан.

Я немного читал полиморфные ассоциации (модель относится к нескольким моделям), и я понимаю, что это, вероятно, путь. После нескольких неудачных попыток я не уверен, как это реализовать.

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

Вот что я в настоящее время в контроллере Крючки и модели ...

def create 
    @hook = hook.new(hook_params) 
    @hook.user = current_user 
    @contact = Contact.new(contact_params) 

    respond_to do |format| 
     if @hook.save 
     format.html { redirect_to @hook, notice: 'Hook was successfully created.' } 
     format.json { render :show, status: :created, location: @hook } 
     format.js 
     else 
     format.html { render :new } 
     format.json { render json: @hook.errors, status: :unprocessable_entity } 
     format.js 
     end 
    end 
    end 

class Hook < ActiveRecord::Base 

belongs_to :user 
    has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "https://s3.amazonaws.com/app/assets/leadmagnet.png" 
    validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ 
end 

А вот контроллер контакты и модель ...

def create 
    @contact = Contact.new(contact_params) 
    @contact.user = current_user 

    respond_to do |format| 
    if @contact.save 
      if user_signed_in? 
      format.html { redirect_to @contact, notice: 'Contact was successfully created.' } 
      else 
      format.html { redirect_to @contact, notice: 'Contact was successfully created.' } 
      end 
      format.json { render :show, status: :created, location: @contact } 
    else 
      format.html { render :new } 
      format.json { render json: @contact.errors, status: :unprocessable_entity } 
    end 
    end 
    end 

class Contact < ActiveRecord::Base 

belongs_to :owner, :class_name => 'User' 
    belongs_to :user 
    validates :email, :presence => {:message => 'Email cannot be blank'} 
end 
+0

Что вопрос вы испытываете конкретно? – OneChillDude

+0

Добро пожаловать в переполнение стека. Это не обязательно или особенно желательно рассматривать Stack Overflow как социальный сайт. SO - это скорее онлайн-ссылка, похожая на Википедию, где такие вещи, как «Привет и спасибо заранее за любую помощь в отношении этого препятствия, с которым я сталкиваюсь». и «Спасибо за любую помощь!» на самом деле не нужны. Придерживайтесь написания хорошо продуманных вопросов, и вы отлично справитесь. –

ответ

1

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

Вам не нужно напрямую связывать Контакты с Пользователями. Вы должны связать Контакты с крючками и затем доцентом Контакты через Крючки

class User < ActiveRecord::Base 
    has_many :hooks 
    has_many :contacts, through: :hooks 
end 

class Hook < ActiveRecord::Base 
    belongs_to :user 
    has_many :contacts 

    accepts_nested_attributes_for :contacts 
end 

class Contact < ActiveRecord::Base 
    belongs_to :hook 
end 

Теперь на создании действия ContactsController, вы можете сначала получить Крюк либо по URL парам или передается через почтовое тело. Вы можете сначала найти крюк и создать контакт на него через:

hook = Hook.find(hook_id) 
@contact = hook.contacts.new(contacts_param) 

Если вы хотите создать контакты при создании нового Крюка, вам нужно добавить: contacts_attributes на strong_params, а затем передать массив контактных атрибутов через POST.Добавление accepts_nested_attributes_for модели Hook позволяет легко создавать контакты, создавая Крючки, просто введя:

@hook = Hook.new(hook_params) 
+0

Это похоже на то, что мне нужно. Благодарю. Однако после реализации вашего решения я получаю эту ошибку ... ** NameError в/контактах неопределенный локальные переменные или метод «hook_id» для # ** Вот создать действие контроллера Гук .. . определение функции создания крюк = hook.find (hook_id) = hook.contacts.new @ Контакт (contact_params) @ contact.user = current_user' – user2101461

+0

Вам необходимо гнезда Контакты маршруты в крючками. Если вы создаете новый контакт на существующем Hook, вы, вероятно, сделаете это для просмотра Hook #show. Следовательно, ваш # POST-маршрут #create должен выглядеть так: '/ hooks /: hook_id/contacts'. См. Эту страницу для получения дополнительной информации: http://guides.rubyonrails.org/routing.html. Кроме того, как я уже упоминал, нет необходимости напрямую связывать Контакты и Пользователей, поскольку они будут связаны через Крюк, поэтому '@contact.user = current_user' не требуется. – tagCincy

0

Если я правильно понял, вы хотите создать как Hook, так и Contact, а также сопоставить как current_user. В вашем коде вы создаете оба, но вы связываете только @hook с current_user и сохраняете его только при игнорировании @contact. Просто связать его и сохранить его, а также:

def create 
    @hook = hook.new(hook_params) 
    @hook.user = current_user 
    @contact = Contact.new(contact_params) 
    @contact.user = current_user 

    respond_to do |format| 
     if @hook.save && @contact.save 
     format.html { redirect_to @hook, notice: 'Hook was successfully created.' } 
     format.json { render :show, status: :created, location: @hook } 
     format.js 
     else 
     format.html { render :new } 
     format.json { render json: @hook.errors + @contact.errors, status: :unprocessable_entity } 
     format.js 
     end 
    end 
    end 
+0

Привет, Ури и @ brian-wheeler, спасибо за ответ так быстро. Проблема, с которой я сталкиваюсь, связывает контакты с крючками. Таким образом, крючки имеют контакты, а контакты могут быть связаны с определенным крючком. – user2101461

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