私は自転車モデルを持っています:
class Bike < ActiveRecord::Base
has_one :make
has_one :model
has_one :year
アプリのホームページにcollection_select
、make、model、year の 3 つの入力 (2 番目の 2 つは、AJAX を使用して以前の collection_select の選択値に基づいて動的に設定されます) を持つフォームを実装しようとしています。フォーム自体がレンダリングされ、すべての AJAX リクエストが機能しています。
送信時に、(collection_selects で選択された値の ID に基づいて) ユーザーの選択に一致する既存の Bike モデル レコードの表示ページをレンダリングしたいと考えています。
これがフォームです (これはバイクの新しいページではなく、ホームページにあります)。バイク コントローラーで検索アクションを作成しましたが、それにデータを渡す方法がわかりません。
<%= form_for(:bike, :url => {:controller => 'bikes', :action => 'search'}, :html => {:role => "form", :class => "form-horizontal"}) do |f| %>
<div class="form-group">
<%= label :make_id, 'Make' %>
<%= collection_select(:bike, :make_id, Make.all, :id, :name, {include_blank: true}, {:class=>'form-control'})%>
</div>
<div class="form-group">
<div id="bikeModels"
<p><%= render 'shared/model_questions_fields', :current_models => [] %></p>
</div>
</div>
<div class="form-group">
<div id="modelYears"
<p><%= render 'shared/year_questions_fields', :current_years => [] %></p>
</div>
</div>
<%= f.submit "Show Quote", class: "btn btn-primary btn-lg" %>
<% end %>
共有/model_questions_fields
<script type="text/javascript">
jQuery(function($) {
// when the #model field changes
$("#bike_model_id").change(function() {
// make a POST call and replace the content
var model = $('select#bike_model_id :selected').val();
if(model == "") model="0";
jQuery.get('/bikes/update_year_select/' + model, function(data){
$("#modelYears").html(data);
})
return false;
});
})
</script>
<%= label :model_id, 'Model' %>
<% if !current_models.blank? %>
<%= collection_select :bike, :model_id, current_models, :id , :name, {include_blank: true}, {:class=>'form-control'} %>
<% else %>
<%= collection_select :bike, :model_id, [], :id , :name, {include_blank: true}, {:class=>'form-control'} %>
<% end %>
共有/year_questions_fields
<%= label :year_id, 'Year' %>
<% if !current_years.blank? %>
<%= collection_select :bike, :year_id, current_years, :id , :year_value, {include_blank: true}, {:class=>'form-control'} %>
<% else %>
<%= collection_select :bike, :year_id, [], :id , :year_value, {include_blank: true}, {:class=>'form-control'} %>
<% end %>
バイク_コントローラー
class BikesController < ApplicationController
before_action :set_bike, only: [:show, :edit, :update, :destroy]
# GET /bikes
# GET /bikes.json
def index
@bikes = Bike.paginate(page: params[:page])
end
# GET /bikes/1
# GET /bikes/1.json
def show
end
# GET /bikes/new
def new
@bike = Bike.new
end
def search
@bike = Bike.find_by(:make_id => make_id, :model_id => model_id, :year_id => year_id)
redirect_to :action => "show", :id => @bike.bike_id
end
def update_model_select
models = Model.where(:make_id=>params[:id]).order(:name) unless params[:id].blank?
render :partial => "shared/model_questions_fields", :locals => { :current_models => models }
end
def update_year_select
model = Model.find(params[:id])
render :partial => "shared/year_questions_fields", :locals => { :current_years => model.years }
end
private
# Use callbacks to share common setup or constraints between actions.
def set_bike
@bike = Bike.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def bike_params
params.require(:bike).permit(:year_id, :make, :make_id, :model, :model_id, :kind,
:msrp, :current_price, :customer_id, :side_picture, :like_new_value, :excellent_value, :good_value,
:fair_value)
end
end
ユーザーが選択した make_id、model_id、および年に基づいて bike_id を取得する必要があります。コントローラーを介してレコードを取得する方法について混乱しています。