【问题标题】:Create a select from existing or create new in a form Rails 3从现有的表单中创建一个选择或在 Rails 3 中创建新的表单
【发布时间】:2013-06-13 00:13:40
【问题描述】:

所以我正在尝试设置组织的名称属性并创建一个新组织或从同一表单中选择以前存在的组织。

我已尝试在此处关注 Ryan Bates 关于该主题的 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 %>

===================================编辑============ ================================== 所以目前,当我尝试用只写在虚拟文本字段中的东西来创建一个组织时,我的日志告诉我以下内容:

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=&gt;"Virtual Organization", :unlogged_books_num=&gt;"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> 

【问题讨论】:

  • 你能详细说明“不起作用”吗?它会给出错误信息吗?选择是否有效但新的填写名称无效?
  • 提交表单的结果将要么是删除虚拟变量内容,如果它们被输入并显示一个错误,必须有一个名称才能保存表单,或者如果我取消验证名称,它没有将任何名称放入组织表中,并且我的数据库中的组织名称为空
  • 我怀疑验证发生在before_save 之前。也许试试before_validation :create_org_from_name
  • mbratch,我已经尝试过了,但它仍然无法在数据库中存储正确的值。它仍然告诉我名称不能为空。我还尝试使:create_org_from_name 的函数看起来像这样:self.name == new_organization_name unless new_organization_name.blank?,它仍然说名称不能为空,并且表单删除了new_organization_name 字段中写入的内容而不保存任何信息
  • 如果您在控制台或日志中查看来自 rails 服务器的详细信息,当它在控制器中点击 create 时,new_organization_name 是否会出现在参数哈希?

标签: ruby-on-rails-3 forms rails-models


【解决方案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 方法中创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2014-04-17
    • 2018-09-24
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多