【问题标题】:Return original selection in collection_select when editing entry编辑条目时在 collection_select 中返回原始选择
【发布时间】:2010-02-24 10:52:11
【问题描述】:

我试图了解 Rails 中的 collection_selects。我可以从数据库表中填充下拉列表,提交所选选项并显示结果。但是,当用户选择编辑条目时,我无法弄清楚如何在下拉列表中显示所选选项。

这是我的视图代码的摘录:

<p>
  <%= f.label :Status %><br />
  <%= f.text_field :status %>
</p>
<p>
  <%= f.label :Manager %><br />
  <%= f.collection_select(:manager, @managers, :id, :name, {:include_blank => true}) %>
</p>

这是我的控制器代码:

class ProjectsController < ApplicationController
  # GET /projects
  # GET /projects.xml

  before_filter :require_user

  def index
    @projects = Project.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @projects }
    end
  end

  # GET /projects/1
  # GET /projects/1.xml
  def show
    @project = Project.find(params[:id])

    projectid = params[:id]
    @evidence = Evidence.find(:all, :conditions => ["projectid = ?", projectid])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @project }
    end
  end

  # GET /projects/new
  # GET /projects/new.xml
  def new
    @project = Project.new
    @managers = Manager.find(:all)

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @project }
    end
  end

  # GET /projects/1/edit
  def edit
    @project = Project.find(params[:id])
    @managers = Manager.find(:all)
  end

  # POST /projects
  # POST /projects.xml
  def create
    @project = Project.new(params[:project])

    respond_to do |format|
      if @project.save
        flash[:notice] = 'Project was successfully created.'
        format.html { redirect_to(@project) }
        format.xml  { render :xml => @project, :status => :created, :location => @project }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @project.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /projects/1
  # PUT /projects/1.xml
  def update
    @project = Project.find(params[:id])

    respond_to do |format|
      if @project.update_attributes(params[:project])
        flash[:notice] = 'Project was successfully updated.'
        format.html { redirect_to(@project) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @project.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /projects/1
  # DELETE /projects/1.xml
  def destroy
    @project = Project.find(params[:id])
    @project.destroy

    respond_to do |format|
      format.html { redirect_to(projects_url) }
      format.xml  { head :ok }
    end
  end
end

这是我的模型的代码:

class Manager < ActiveRecord::Base
    has_many :projects
end

class Project < ActiveRecord::Base
    belongs_to :manager

    validates_presence_of(:name, :reference, :client, :status)
    validates_uniqueness_of (:reference)
end

非常感谢任何帮助。

谢谢!

【问题讨论】:

  • 请在此处显示您的查看代码
  • 您能否将您的模型和控制器代码添加到您的问题中?
  • 刚刚添加到 Klew,感谢您的帮助。

标签: ruby-on-rails collections webforms drop-down-menu


【解决方案1】:

根据documentation

collection_select(object, method, collection, value_method, text_method, 选项 = {},html_options = {})

...调用方法返回的值 在实例对象上将是 选择。

这意味着您的 :manager 方法必须返回一个与您的 @managers 实例变量中的管理器之一匹配的值,才能成为选定的选项。

【讨论】:

    【解决方案2】:

    我认为您需要将:manager 更改为:manager_id

    <%= f.collection_select(:manager_id, @managers, :id, :name, {:include_blank => true}) %>
    

    【讨论】:

    • 不,恐怕这行不通。它仍然只是显示没有选择任何内容的下拉菜单。
    猜你喜欢
    • 2020-03-28
    • 2020-12-20
    • 2015-08-27
    • 2011-07-31
    • 2014-06-25
    • 2021-04-09
    • 1970-01-01
    • 2018-04-12
    • 2012-03-13
    相关资源
    最近更新 更多