2015-03-02 1 views
0

J'ai un emplacement de modèle qui contient beaucoup de messages. J'essaie de permettre aux utilisateurs qui parcourent les emplacements d'envoyer des messages aux propriétaires de l'emplacement.Définition automatique des attributs imbriqués dans Rails

Je location.rb

has_many :messages 
accepts_nested_attributes_for :messages 

et message.rb

belongs_to :location 

Dans locations_controller.rb

def location_params 
     params.require(:location).permit(:name, 
             :user_id, 
             :image, 
             :latitude, 
             :longitude, 
             location_images_attributes: [:id, :location_id, :location_image, :_destroy], 
             messages_attributes: [:id, :location_id, :from_email, :to_email, :content]) 
    end 

J'ai actuellement à mon avis le code suivant:

<%= simple_form_for @location do |l| %> 
    <%= l.simple_fields_for :messages, @location.messages.build do |m| %> 
     <%= m.input :content %> 
     <%= m.input :to_email, :input_html => {:value => @location.user.email}, as: :hidden %> 
    <% end %> 
    <%= l.button :submit %> 
<% end %> 

Je ne veux pas définir la valeur du champ de courrier électronique par l'intermédiaire du champ caché, mais je veux passer la valeur du contrôleur. Ou un modèle. S'il vous plaît donnez votre avis.

Répondre

0

Peut-être essayer cette approche dans votre modèle Location:

class Location < ActiveRecord::Base 
    has_many :messages, after_add: :set_email 
    accepts_nested_attributes_for :messages 

    def set_email(message) 
    message.to_email = user.email 
    end 
end 

Fondamentalement, vous devez vous enregistrer une méthode pour Location, quand un nouveau message est ajouté à messages ensemble.

Dans cet exemple, je l'ai nommé set_email, ce qui prend l'objet message comme argument, et vous pouvez le modifier librement. Je suis en train de définir le to_email basé sur locationemail.

Espérons que cela résout votre problème!

+0

Merci. Après avoir réfléchi, j'ai réalisé que ce message a location_id. Et l'emplacement a user_id, donc je peux extraire les utilisateurs via @ message.location.user.email ... – luksimir

0

Vous pourriez faire quelque chose comme ça dans le modèle du message:

before_create :set_to_email 

def set_to_email 
    self.to_email = self.location.user.email 
end 

côté incliné est que sur chaque action create quelques recherches de base de données supplémentaires sont effectuées. Donc, à grande échelle, ce n'est pas une solution idéale en termes d'optimisation des performances.