Создать выбор из существующих или создать новый в форме Rails 3
Поэтому я пытаюсь установить атрибут имени организации и создать новую организацию или выбрать из ранее существующей организации из той же формы.
Я пытался следить за Railscast Райана Бейтса по этой теме: http://railscasts.com/episodes/57-create-model-through-text-field
Я также попробовал множество решений из стека. Однако я не могу заставить его работать (у меня есть проверка, которая не распознает виртуальный атрибут, который я использую)
Итак, модель моей организации:
class Organization < ActiveRecord::Base
has_many :materials
has_many :users
has_and_belongs_to_many :causes
has_and_belongs_to_many :schools, :join_table => 'organizations_schools'
####The following line has been edited ####
attr_accessible :name, :unlogged_books_num, :id, :new_organization_name
attr_accessor :new_organization_name
before_validation :create_org_from_name
validates_presence_of :name
def self.assign_school_to_organization(org, school)
orgschool = OrganizationsSchool.create(:organization_id=> org.id, :school_id=> school[0])
end
def create_org_from_name
create_organization(:name=>new_organization_name) unless new_organization_name.blank?
end
end
Я также попробовал create_org_from_name
в дальнейшем:
def create_org_from_name
self.name = new_organization_name
end
И это не меняет имя на имя организации перед проверкой или сохранением экземпляра. Я также пытался изменить before_save
в before_validation
и это не сработало
Мой контроллер для организации (я также пытался изменить это при создании)
def create
respond_to do |format|
@organization = Organization.new(params[:organization])
@organization.name = @organization.new_organization_name unless @organization.new_organization_name.blank?
if @organization.save
@school = params[:school]
Organization.assign_school_to_organization(@organization, @school)
format.html { redirect_to @organization, notice: 'Organization was successfully created.' }
format.json { render json: @organization, status: :created, location: @organization }
else
format.html { render action: "new" }
format.json { render json: @organization.errors, status: :unprocessable_entity }
end
end
end
И, наконец, у меня есть то, что сейчас делает моя форма:
<%= form_for(@organization) do |f| %>
<% if @organization.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@organization.errors.count, "error") %> prohibited this organization from being saved:</h2>
<ul>
<% @organization.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<% @schools = School.all %>
<% @organizations = Organization.all %>
<div class="field">
<%= f.label 'Organization Name' %><br />
<%= f.collection_select(:name, @organizations, :name, :name, :prompt=>"Existing Organization") %>
Or Create New
<%= f.text_field :new_organization_name %>
</div>
<div class="field">
<%= f.label :unlogged_books_num %><br />
<%= f.number_field :unlogged_books_num %>
</div>
<div class="field">
<%= f.label 'School' %><br />
<% school_id = nil %>
<%= collection_select(:school, school_id, @schools, :id, :name) %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
================================== EDIT =============== ============================= Итак, в настоящее время, когда я пытаюсь создать организацию с чем-то, написанным только в виртуальном текстовом поле, My журнал говорит мне следующее:
Processing by OrganizationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"igoefz8Rwm/RHrHLTXQnG48ygTGLydZrzP4gEJOPbF0=", "organization"=> {"name"=>"", "new_organization_name"=>"Virtual Organization", "unlogged_books_num"=>""}, "school"=>["1"], "commit"=>"Create Organization"}
Rendered organizations/_form.html.erb (7.1ms)
Rendered organizations/new.html.erb within layouts/application (8.0ms)
Completed 200 OK in 17ms (Views: 12.2ms | ActiveRecord: 1.0ms)
================================ РЕДАКТИРОВАТЬ 2============================================ Так вот, что я получаю из консоли rails, если пытаюсь создать новую организацию с помощью этой команды: Organization.create(:new_organization_name=>"Virtual Organization", :unlogged_books_num=>"3")
irb(main):001:0> Organization.create(:new_organization_name=>"Virtual Organization", :unlogged_books_num=>"3")
(0.1ms) BEGIN
(0.1ms) ROLLBACK
=> #<Organization id: nil, name: nil, unlogged_books_num: 3, created_at: nil, updated_at: nil>
Если функция create_org_from_name
является self.name = new_organization_name
, тогда результат той же команды из консоли будет пустым:
irb(main):002:1> Organization.create(:new_organization_name=>"Virtual Organization", :unlogged_books_num=>"3")
irb(main):003:1>
1 ответ
Тебе нужно:
before_validation :create_org_from_name
а также
def create_org_from_name
self.name = new_organization_name if not new_organization_name.blank?
end
Вы не хотите создавать в своем методе before_validation.