我正在运行Rails 4和Ruby 2.
我正在创建一个应用程序,您可以通过每餐来跟踪您的卡路里和常量营养素。
我正在添加一个用餐收藏页面,用户可以添加他们一直吃的饭菜。我通过收藏夹完成了这个:布尔迁移。
当用户创建新餐时,我想通过类似current_user.meals.where(favourite: true)
的内容向他们展示他们已保存的收藏的下拉框。
当他们从下拉列表中点击他们的一个收藏夹时,我会希望这些信息填充表格中的蛋白质,碳水化合物和脂肪输入。
这样做的最佳方式是什么?
MealsController:
class MealsController < ApplicationController
.
.
.
def new
@meal = current_user.meals.build
end
def create
@meal = current_user.meals.build(meal_params)
respond_to do |format|
if @meal.save
format.html { redirect_to root_path, notice: 'Meal was successfully added.' }
else
format.html { render action: 'new', notice: 'Meal was not added.' }
end
format.js
end
end
.
.
.
private
def set_meal
@meal = Meal.find(params[:id])
end
.
.
.
end
新/编辑膳食表格
<%= form_for(@meal) do |f| %>
.
.
.
<div class="field inline">
<%= f.label :protein %> (g)<br>
<%= f.text_field :protein %>
</div>
<div class="field inline middle">
Carbs (g)<br>
<%= f.text_field :carbohydrates %>
</div>
<div class="field inline right">
<%= f.label :fats %> (g)<br>
<%= f.text_field :fats %>
</div>
<div class="field actions">
<%= f.check_box :favourite, class: "favourites" %> Add to Favourites?
</div>
<div class="actions">
<%= f.submit "Save", class: "btn btn-large" %>
<% if current_page?(edit_meal_path(@meal)) %>
<%= link_to "Delete", @meal, class: "btn btn-large", method: :delete, data: { confirm: "Are you sure?" } %>
<% end %>
</div>
<% end %>
谢谢!
答案 0 :(得分:1)
您可以使用JavaScript / jQuery执行此操作:
$(document).ready(function() {
bindFavoriteMeal();
});
function bindFavoriteMeal() {
$('#favorite_meal_select').change(function() {
var mealId = $(this).val();
var url = "/meals/" + mealId
$.getJSON(url, function(data) {
$.each(data, function(key, value) {
var field = $("#" + key);
if (field.length) {
field.val(value);
}
});
});
});
}
您的膳食控制器中的show
操作必须响应JSON,并且您需要确保表单ID与返回的JSON密钥匹配。 JSON可能看起来像:
{ 'name': 'Mustart Salmon', 'protein': 40, 'carbs': 8, 'other_stuff': 'some_value' }
请参阅Rails Controller Overview: Rendering JSON。
选择下拉列表的实现将取决于它的用途。它是用于将下拉列表中的项目与正在创建的对象相关联吗?在那种情况下,请查看@ jordan-davis的其他答案。或者仅仅是告知用户之前做出的选择?在这种情况下,我建议options_for_select
。选择中有很多内置助手:
答案 1 :(得分:0)
您可以使用collection select
填充下拉列表<%= collection_select :user, :meal, Meal.all, :id, :name, checked: meal.name.first %>
此代码不会剪切和粘贴,但它是为了显示这个想法。之后,您将不得不使用jQuery来获取膳食ID,然后使用它来填充其余信息。你可以从以下几点开始:
$(".dropdown-menu li a").click(function(){
$(this).parents(".dropdown-menu:first").dropdown('toggle')
var selectedMeal = $(this).text();