यहां मेरे 3 मॉडल हैं।मजबूत पैरामीटर का उपयोग करके नेस्टेड मॉडल के साथ बनाएं और अपडेट करें रेल
User
has_many :memberships
has_many :teams, through: :memberships, dependent: :destroy
accepts_nested_attributes_for :memberships
Team
has_many :memberships
has_many :users, through: :memberships, dependent: :destroy
accepts_nested_attributes_for :memberships
Membership
belongs_to :team
belongs_to :user
यहाँ मेरी टीम नियंत्रक के कुछ अंश हैं। मेरा उद्देश्य यहां एक निश्चित टीम में सदस्यों को जोड़ने/अपडेट करना है। ध्यान दें कि सदस्यों को जोड़ने के लिए स्रोत पहले से ही उपयोगकर्ताओं के समूह के रूप में मौजूद है। टीम नियंत्रक
#parameters for team details
def team_params
params.require(:team).permit(:name, :department)
end
#parameters for members (includes leader)
def members_params
params.require(:team).permit(:leader, members:[])
end
#get id values from members_params and store in an array
def member_ids
members_params.values.flatten
end
प्रपत्र के लिए के लिए
TeamsController
def create
@team = Team.new(team_params)
@team.users << User.find(member_ids) #add leader and members to team
if @team.save
#redirect to created team
else
#show errors
end
end
def update
#TO DO: update team roster here
if @team.update(team_params)
#redirect to updated team
else
#show errors
end
end
मजबूत मापदंडों, मैं सिर्फ है:
- नाम (पाठ क्षेत्र)
- विभाग (कॉम्बो बॉक्स)
- नेता (कॉम्बो बॉक्स, चयनित विभाग के आधार पर जेनरेट किए गए विकल्पों के साथ, चयनित उपयोगकर्ता की उपयोगकर्ता आईडी के रूप में सबमिट करता है)
- सदस्य, चयनित विभाग के आधार पर उत्पन्न विकल्पों के साथ (कॉम्बो बॉक्स, कई, चयनित उपयोगकर्ताओं के उपयोगकर्ता आईडी की एक सरणी के रूप में प्रस्तुत)
मैं सफलतापूर्वक एक टीम बना सकते हैं, एक साथ सत्यापन के गुजरने के साथ (दोनों टीम और सदस्यता मॉडल), मेरे निर्माण पर। हालांकि, मुझे इस बात को लेकर कोई जानकारी नहीं है कि टीम को कैसे अपडेट किया जाए, क्योंकि अगर मैं @team.users.clear
का उपयोग करता हूं और फिर बस वही काम करता हूं (मुझे पता है, यह करने के लिए यह थोड़ा बेवकूफ है), यह मान्य होगा, लेकिन यह इसे बिना सहेजेगा अगर कोई त्रुटि है या नहीं।
फार्म कोड फार्म के लिए
<%= form_for(@team, remote: true) do |f| %>
<%= f.label :name, "Name" %>
<%= f.text_field :name %>
<%= f.label :department, "Department" %>
<%= f.select :department, options_for_select(["Architectural", "Interior Design"], department), include_blank: true %>
<%= f.label :leader, "Leader" %>
<%= f.select :leader, select_leaders(department, @team.id), {include_blank: true, selected: pre_select(:leader)} %>
<%= f.label :members, "Members" %>
<%= f.select :members, select_members(department, @team.id), {include_blank: true}, {id: "team_members", multiple: :multiple, data: {member_ids: pre_select(:members)}}%>
<% end %>
नोट:
- यह फार्म दोनों खाली और आबादी वाले रूपों के लिए काम करता है।
:members
फ़ील्ड select2 सक्षम है।
तो मेरे सवालों यहां हैं:
- मैं टीम के सदस्यों कैसे कर सकते हैं? क्या वर्तमान में मेरे मजबूत पैरामीटर के आधार पर अद्यतन करना संभव है, या क्या उन्हें संशोधित करने की आवश्यकता है?
- क्या मेरी निर्माण विधि को भी संशोधित किया जाना चाहिए?
कुछ विकल्प समाधान के लिए
विकल्प # 1 (सबसे अच्छा समाधान अब तक)
मैं केवल इस के लिए एक प्राथमिक चिकित्सा समाधान था, इसलिए मुझे लगता है कि क्या तुलना में एक बेहतर दृष्टिकोण के अग्रणी मैंने नीचे किया मैंने यहां क्या किया है, सदस्य_ड्स से प्राप्त उपयोगकर्ताओं के साथ उपयोगकर्ता पैराम बनाने के लिए मूल्यों के रूप में। समाधान 1 से
TeamsController
def create
team = Team.new(team_params.merge({users: User.find(member_ids)}))
...
end
def update
...
if @team.update(team_params.merge({users: User.find(member_ids)}))
..
end
विकल्प # 2
स्वतंत्र, मैं केवल team_params
के रूप में मजबूत पैरामीटर था।
TeamsController
...
private
def team_params
params.require(:team).permit(:name, :department, :leader, members:[])
end
मैंने नेता और सदस्यों दोनों के लिए सेटटर विधियां बनाई हैं। लेकिन ऐसा लगता है कि सदस्य नेता सेटर को ओवरराइट करते हैं क्योंकि मैंने दोनों सेटर्स के लिए update
विधि का उपयोग किया था, और अपडेट उसी संसाधन का उपयोग करता है जो उपयोगकर्ता है। इस विकल्प के साथ एक कामकाज संभव है।
Team
...
def leader=(leader_id)
#self.update(users: User.find(leader_id))
end
def members=(members_ids)
#self.update(users: User.find(members_id))
end
कृपया अपना फॉर्म कोड पोस्ट करें, यह कोड को अधिक स्पष्टता के साथ कोड से संबंधित आपकी चिंता को समझने में मदद करेगा। – Surya
यह स्पष्ट नहीं है, आपके पास 2 चयन क्यों हैं (एक नेता के लिए, सदस्यों के लिए एक) और फिर नेता होने पर कहीं भी स्टोर न करें। – MikDiet
सदस्य को बेहतर ढंग से समझने के लिए उपयोगकर्ता और सदस्यों के सदस्यों में सदस्यता को अलग करने के लिए। सभी सदस्यता (चाहे नेता या सदस्य) सदस्यता मॉडल के माध्यम से पूरी तरह से सदस्यों के रूप में संग्रहीत किया जाता है। मैंने अपनी पोस्ट संपादित की ताकि आप देख सकें कि मैंने अभी तक क्या प्रयास किया है। – oLraX