Rails -在创建对象的新实例时搜索/显示可用选项



我有一个一对多的关系,每个列表条目有一个电影,其中一个电影可以在列表条目中使用。我的list_entries表有一个movie_id和一个list_id。数据库模式

我在列表中嵌套了list_entries,所以我可以在创建新实例时直接传递list_id。

Rails.application.routes.draw do
devise_for :users
root to: 'pages#home'
resources :movies, only: [:new, :index, :create, :show, :destroy, :edit, :update]
resources :users, only: [:show, :edit, :update]
resources :lists, only: [:new, :create, :show, :index, :destroy] do 
resources :list_entries 
end
end

现在我可以创建和销毁列表条目,但我必须手动指定电影id。我想要实现的用户体验是让用户能够搜索电影从他们的list_entries/新形式,但我甚至不知道从哪里开始。现在的形式:

<%= simple_form_for @list_entry, url: list_list_entries_path do |f| %>
<%= f.input :comment %>
<%= f.input :movie_id %>
<%= f.submit "Add", class: "btn devise-button" %>
<% end %>

My list entries controller:

class ListEntriesController < ApplicationController
before_action :find_list, only: [:index, :create, :show, :new, :destroy]
def new
@list_entry = ListEntry.new
end
def index
@list_entries = ListEntry.where(list: @list)
end
def show
@list_entry = ListEntry.find(params[:id])
end
def destroy
@list_entry = ListEntry.find(params[:id])
@list_entry.destroy
redirect_to list_list_entries_path
end
def create 
@list_entry = ListEntry.new(entry_params)
@list_entry.list_id = params[:list_id]
if @list_entry.save
redirect_to list_list_entries_path
else
render 'new'
end
end
private
def find_list
@list = List.find(params[:list_id])
end

def entry_params
params.require(:list_entry).permit(:comment, :movie_id)
end
end

如果您不想在表单中手动指定movie_id,您可以使用simple_form_for关联帮助器:

<%= f.input :comment %>
<%= f.association :movie %>

我认为它应该基于电影标题进行标记,但如果不是,您可能必须在movie模型中指定一个#to_label方法。

或者,您可以在#new操作中查询电影,并使用它们在视图中做任何您喜欢的事情:

def new
@list_entry = ListEntry.new
@movies = Movie.all # or whatever query you think is relevant
end

#collection_select文档可能在这里有用:https://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select

最新更新