如何从rails中的下拉菜单中捕获选择值?

时间:2017-07-12 06:39:36

标签: ruby-on-rails-5

我有城市表和个人资料表。以下是两者的模型:

class City < ActiveRecord::Base
    belongs_to :profile
end

class Profile < ActiveRecord::Base
    belongs_to :user
    has_one :city
end

我正在尝试在个人资料视图页面中为城市创建下拉列表。

<%= form_for @profile, url: user_profile_path, :html => { :multipart => true} do |f| %>

    <div class="field">
        <%= f.label :country %>
        <%= f.text_field :country %>
    </div>

    <div class="field">
        <%= f.label :city_id %>
        <%= f.select :city_id, options_for_select(@city.collect{ |u| [u.name, u.id] }) %>
    </div>

    <div class="actions">
        <%= f.submit "Update Profile" %>
    </div>
<% end %>

这是ProfilesController:

class ProfilesController < ApplicationController
    def new
            @user = User.find( params[:user_id] )
            @profile = Profile.new
            @city = City.all
    end

    def create
            @user = User.find( params[:user_id] )
            @profile = @user.build_profile(profile_params)
            if @profile.save
                flash[:success] = "Profile Updated!"
                redirect_to user_path( params[:user_id] ) 
            else
                render action: :new 
            end
    end
end 

如何在配置文件表中添加city_id列,我无法从上面的ProfilesController中捕获city_id。 我在&#34; ProfilesController&#34;中尝试了@city = City.find( params[:city_id] ), &#34; Def create&#34;,我收到了这个错误:

  

找不到带有&#39; id&#39; =

的城市

请建议。

2 个答案:

答案 0 :(得分:0)

尝试将city_id列入白名单而不是city

private def profile_params
  params.require(:profile).permit(:country, :city)
end

改变你的联想 -

class City < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
  belongs_to :city
end

city_id列应位于您使用belongs_to关联

的模型中

答案 1 :(得分:0)

也许尝试替换

has_one :city

通过

belongs_to :city

在您的个人资料模型和城市模型中替换

belongs_to :profile

通过

has_many :profiles