按照railscasts的指南在collection_select上设置自动完成功能。 https://www.youtube.com/watch?v=M7yhPlIehFA 在我的例子中,我正在尝试创建一个与游戏相关的聊天室。
MODEL
belongs_to :game
validates :game, presence: true
def game_name
game.try(:name)
end
def game_name=(name)
self.game = Game.where(name: name).first_or_create if name.present?
end
CONTROLLER
def create
@room = current_user.chatrooms.build(room_params)
if @room.save
redirect_to @room
else
render 'new'
end
end
def room_params
params.require(:chatroom).permit(:title, :description, :game_id)
end
HTML
<%= simple_form_for @room do |f| %>
<p class="ftitle">Chatroom title</p>
<%= f.input :title, label: false %>
<p class="ftitle">Chatroom description</p>
<%= f.input :description, label: false %>
<p class="ftitle">Select related game</p>
<%= f.text_field :game_name, data: { autocomplete_source: Game.order(:name).map(&:name) } %>
<%= f.button :submit %>
<% end %>
它工作正常,直到我尝试创建一个附加游戏的聊天室。它不会将game_id作为游戏附加。不知道为什么。 感谢。
答案 0 :(得分:1)
尝试根据名称链接游戏似乎非常脆弱,并且对未来的滥用行为持开放态度。
但是,如果您真的想要这样做,请将:game_name
添加到room_params中的.permit
方法。
在这里传递ID会更健壮。而不是纯文本。