ruby on rails كيفية استخدام كل من الحساب والمستخدم الجداول مع وضع



طريقة انشاء جدول في برنامج access (3)

ألا يمكنك استخدام شيء مثل ما يغطيه هذا القضبان ؟:؟

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

يمكنك إعداد النماذج الخاصة بك كما هو موضح في تلك سكرينكستس، وذلك باستخدام accepts_nested_attributes_for.

بعد ذلك، سيكون نموذج المشاهدات / الاستحداث / التسجيل / new.html.erb ل: المستخدم كالمعتاد، ويمكن أن يتضمن نموذجا متداخلا للحساب:.

لذلك شيء من هذا القبيل ضمن هذا النموذج الافتراضي:

<%= f.fields_for :account do |account_form| %>
<div>
  <p>
    <%= account_form.label :name, "Account Name", :class => "label" %>
    <%= account_form.text_field :name, :class => "text_field" %>
    <span class="description">(e.g., enter your account name here)</span>
  </p>
</div>

<div>
  <p>
    <%= account_form.label :company, "Company Name", :class => "label" %>
    <%= account_form.text_field :company, :class => "text_field" %>
  </p>
</div>
<% end %>

هذه هي شفرة نموذجية من تطبيق أعمل عليه، وأستخدم الأحجار الكريمة simple_form، لذا قد يكون المساعدون المستخدمون في تطبيقك مختلفا، ولكن ربما تحصل على هذه الفكرة.

لذلك عندما يتم إنشاء مستخدم (عند التسجيل)، يمكنهم أيضا ملء المعلومات التي سيتم استخدامها من قبل نموذج الحساب لإنشاء حسابهم بمجرد أن تصل إلى زر "الاشتراك".

وقد ترغب في تعيين سمة على هذا المستخدم مثل "أدمين" أيضا ... يبدو أن هذا المستخدم الأولي سيكون المستخدم "أدمين" للشركة، على الرغم من المستخدمين الآخرين قد يكون الوصول أيضا.

امل ان يساعد.

أنا أعمل مع القضبان 3.1.0 واستنباط 1.4.8، وأنا جديدة على حد سواء.

أريد السماح لعدة مستخدمين بالحساب. أول مستخدم للاشتراك بإنشاء حساب (ربما لشركتهم)، ثم يمكن للمستخدم إضافة المزيد من المستخدمين. يتم ربط المستخدم دائما بحساب واحد بالضبط.

لدي جداول حسابات المستخدمين. نماذج مختصرة:

class User < ActiveRecord::Base
  belongs_to :account
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :confirmable, :lockable, :timeoutable
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

class Account < ActiveRecord::Base
  has_many :users, :dependent => :destroy
  attr_accessible :name, :account_type
end

والسؤال هو، عندما يقوم المستخدم الأول بالتسجيل، كيف يمكنني إنشاء كل من الحساب والمستخدم؟

  • هل أحتاج إلى تعديل / إلغاء إنشاء registrations_controller، شيء مثل الإجابة هنا ؟ لم أستطع معرفة كيفية إنشاء الحساب ثم تمريره إلى ابتكار لخلق المستخدم.

  • account_id موجود بالفعل في نموذج المستخدم. هل يجب إضافة account_name و account_type إلى نموذج المستخدم وإنشاء سجل حساب جديد إذا لم يتم تمرير account_id في؟ في هذه الحالة، أحاول إخفاء إنشاء الحساب من ديفيس، ولكن لست متأكدا من أن تعمل منذ ما زلت بحاجة إلى المطالبة ل account_name و account_type على صفحة التسجيل.



Answer #2

وأخيرا حصلت على هذا العمل باستخدام سمات متداخلة. كما نوقش في التعليقات على إجابة كينتون، يتم عكس هذا المثال. إذا كنت تريد عدة مستخدمين لكل حساب، فعليك إنشاء الحساب أولا، ثم المستخدم - حتى إذا كنت تنشئ مستخدما واحدا فقط للبدء به. ثم تكتب وحدة تحكم الحسابات الخاصة بك وعرض، وتجاوز وجهة النظر ديفيس. يبدو أن وظيفة ديفيس لإرسال رسائل تأكيد البريد الإلكتروني وما إلى ذلك تعمل إذا كنت مجرد إنشاء المستخدم مباشرة، أي أن هذه الوظيفة يجب أن تكون جزءا من الاشياء أوتوماجيكال في نموذج ابتكار؛ فإنه لا يتطلب استخدام وحدة تحكم ديفيس.

مقتطفات من الملفات ذات الصلة:

نماذج في التطبيق / النماذج

class Account < ActiveRecord::Base
  has_many :users, :inverse_of => :account, :dependent => :destroy
  accepts_nested_attributes_for :users
  attr_accessible :name, :users_attributes
end

class User < ActiveRecord::Base
  belongs_to :account, :inverse_of => :users
  validates :account, :presence => true
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :confirmable, :lockable, :timeoutable
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

سبيك / موديلز / account_spec.rb اختبار نموذج رسبيك

it "should create account AND user through accepts_nested_attributes_for" do
  @AccountWithUser = { :name => "Test Account with User", 
                       :users_attributes => [ { :email => "[email protected]", 
                                                :password => "testpass", 
                                                :password_confirmation => "testpass" } ] }
  au = Account.create!(@AccountWithUser)
  au.id.should_not be_nil
  au.users[0].id.should_not be_nil
  au.users[0].account.should == au
  au.users[0].account_id.should == au.id
end

التكوين / routes.rb

  resources :accounts, :only => [:index, :new, :create, :destroy]

التحكم / accounts_controller.rb

class AccountsController < ApplicationController

  def new
    @account = Account.new
    @account.users.build # build a blank user or the child form won't display
  end

  def create
    @account = Account.new(params[:account])
    if @account.save
      flash[:success] = "Account created"
      redirect_to accounts_path
    else
      render 'new'
    end
  end

end

فيوس / أكونتس / new.html.erb فيو

<h2>Create Account</h2>

<%= form_for(@account) do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>

  <%= f.fields_for :users do |user_form| %>
    <div class="field"><%= user_form.label :email %><br />
    <%= user_form.email_field :email %></div>
    <div class="field"><%= user_form.label :password %><br />
    <%= user_form.password_field :password %></div>
    <div class="field"><%= user_form.label :password_confirmation %><br />
    <%= user_form.password_field :password_confirmation %></div>
  <% end %>

  <div class="actions">
    <%= f.submit "Create account" %>
  </div>
<% end %>

القضبان من الصعب إرضاءه جدا حول الجمع مقابل المفرد. لأننا نقول حساب has_many المستخدمين:

  • فإنه يتوقع من المستخدمين_المواصفات (وليس user_attributes) في النموذج والاختبارات
  • فإنه يتوقع مجموعة من التجزئات للاختبار، حتى لو كان هناك عنصر واحد فقط في المصفوفة، وبالتالي فإن [] حول {وسر أتريبوتس}.
  • فإنه يتوقع @ account.users.build في وحدة تحكم. لم أتمكن من الحصول على بناء الجملة f.object.build_users للعمل مباشرة في طريقة العرض.