从rails中的下拉列表中获取所选值

时间:2013-07-27 01:19:12

标签: ruby-on-rails ruby rails-activerecord

enter code here

<h1>Add New Investment Opportunity</h1>

<%= form_for Investopp.new do |f| %>

<div class="field">
<%= f.label :state_id %><br/>
<%= f.collection_select  :state_id, Investopp.year_lookup(@state_ids), :label, :value, include_blank: true %>
</div>

<div class="field">
<%= f.label :city_id, "city" %><br />
<%= f.grouped_collection_select :city_id, Investopp.year_lookup(@state_ids), :cities, :value, :id,:name, include_blank: true %>
</div>
<% end %>
<%= link_to 'Back', investopps_path %>
<%= link_to 'Search', investopps_browsedisplay_path %>


class Investopp < ActiveRecord::Base
attr_accessible :Address, :Buildingname, :Desiredinvrole, :Details,   :Prefferednoofinvestors, :Salesprice, :Weblisting, :photo, :user_id, :state_id, :city_id, :state, :city
has_attached_file :photo, :styles => { :small => "200x200>" }
belongs_to :user
validates :Buildingname, presence: true
validates :Address, presence: true
validates :Desiredinvrole, presence: true
validates :Weblisting, presence: true
validates :Details, presence: true
has_many :states
has_many :cities
def find_state(id)
  if !id  || id==0
      id=1
  end

  @states= State.find(id)
  @states.name

end
def find_city(id)
  if !id  || id==0
      id=1
  end

  @cities= City.find(id)
  @cities.name

end

def self.year_lookup(state_ids)

#create an emptycollection to hold the LabelValue Objects
years = []

state_ids.each do |yr| y = LabelValue.new()
y.label = yr
y.value = State.find_by_id(yr).name
years.push(y)
end

years

end

def self.state_lookup(state_ids)
years = []

state_ids.each do |yr| y = State.new()
 y= State.find_by_id(yr)
years.push(y)
end

years

end 

end

class LabelValue
# name the accessors. Label and Value
attr_accessor :label, :value


def cities
cityids=[]
state_cities=[]

investopps=Investopp.find(:all)
investopps.each do |i|
puts i.city_id
cityids <<i.city_id
end
cityids.uniq!

states=State.find_by_id(label)
cityids.each do |c|
if states.cities.find_by_id(c)
state_cities<< states.cities.find_by_id(c)  
end

end

state_cities
end

end


class InvestoppsController < ApplicationController
# GET /investopps
# GET /investopps.json
def index
@investopps = Investopp.where(:user_id => current_user.id)

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @investopps }
end
end

#GET / investopps / 1    #GET /investopps/1.json    def show

@investopp = current_user.investopps.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @investopp }
end
end

#GET / investopps / new   #GET /investopps/new.json   def new     @investopp = Investopp.new

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @investopp }
end
end

#GET / investopps / 1 /编辑     def编辑     @investopp = Investopp.find(params [:id])     端

#POST / investopps   #POST /investopps.json     def create

#params[:investopp][:state_id]= "gopi"
#params[:investopp][:city_id]= "33" 
@investopp = current_user.investopps.build(params[:investopp])

respond_to do |format|
  if @investopp.save
    format.html { redirect_to @investopp, notice: 'Investopp was successfully created.'    }
    format.json { render json: @investopp, status: :created, location: @investopp }
  else
    format.html { render action: "new" }
    format.json { render json: @investopp.errors, status: :unprocessable_entity }
  end
end

#PUT / investopps / 1   #PUT /investopps/1.json   def更新     @investopp = Investopp.find(params [:id])

respond_to do |format|
  if @investopp.update_attributes(params[:investopp])
    format.html { redirect_to @investopp, notice: 'Investopp was successfully updated.'   }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @investopp.errors, status: :unprocessable_entity }
  end
end

#DELETE / investopps / 1   #DELETE /investopps/1.json   def destroy     @investopp = Investopp.find(params [:id])     @ investopp.destroy

respond_to do |format|
  format.html { redirect_to investopps_url }
  format.json { head :no_content }
end

def lis
@state_names=[]
@state_ids=[]
@city_ids= []
@city_names=[]
@investopp = Investopp.find(:all)
@investopp.each do |item|
  @state_names<< State.find_by_id(item.state_id).name
  @state_ids<< item.state_id
  @city_names<< City.find_by_id(item.city_id).name
  @city_ids << item.city_id
end
puts  @state_ids.uniq!{|i| i}
puts  @city_ids.uniq!{|i| i}

puts "gopi"
respond_to do |format|
  format.html { render "investopps/lis", :locals => { :state_ids => @state_ids, :city_ids => @city_ids, :investopps =>  @investopp } }
  format.json { render json: @investopp }
end

1 个答案:

答案 0 :(得分:0)

您应该使用<%= link_to 'Search', investopps_browsedisplay_path %>而不是使用<%= f.submit %>,而是正确指定操作。因此,您的表单视图将如下所示:

<h1>Add New Investment Opportunity</h1>

<%= form_for Investopp.new, :action => investopps_browsedisplay_path do |f| %>

<div class="field">
<%= f.label :state_id %><br/>
<%= f.collection_select  :state_id, Investopp.year_lookup(@state_ids), :label, :value, include_blank: true %>
</div>

<div class="field">
<%= f.label :city_id, "city" %><br />
<%= f.grouped_collection_select :city_id, Investopp.year_lookup(@state_ids), :cities, :value, :id,:name, include_blank: true %>
</div>
<%= link_to 'Back', investopps_path %>
<%= f.submit 'Search' %>
<% end %>

然后你还需要一个处理事物的控制器方法作为investopps_browsedisplay_path路由,我在你的代码中没有看到任何地方。当然,这不是一种处理这种情况的RESTful方式,并且需要注意的是您的架构可能会混淆问题,但就发送表单数据而言,正确的方法是使用表单提交,而不是一个link_to,它解决了手头的基本问题。