所以,我有一个Ruby on Rails应用程序,其中用户有一个成分列表。当用户将新项目添加到成分列表中时,我需要刷新页面,以便将成分显示在列表中。我希望这可以使用Ajax动态完成,我在互联网上查找解决方案但没有工作:/
这是我的HTML代码(index.html.erb):
<%= form_for(:ingredientList, :url => {:controller => 'ingredients', :action => 'index'}, :remote => true) do |f| %>
<div class ="modal-text col-md-6">
<div class="model-subtitle">Ingrediente: </div>
<%= f.select :value, options_for_select(@ingredient.map{ |ing| [ing.name, ing.id]}, html_options = { class: 'form-control', required: true })%>
</div>
<div class="modal-text col-md-6">
<div class="model-subtitle">Quantidade: </div>
<%= f.text_field :quantity, class: 'form-control', placeholder: "quantidade", autofocus: true %>
</div>
<%= f.submit :Salvar, class: 'btn btn btn-success center-block'%>
我的控制器:
def index
@user = User.find_by id: session[:user_id]
@ingredients = Ingredient.joins(:ingredients_users).where("user_id = ?", session[:user_id]).select("*")
@user_id = session[:user_id]
@ingredient = Ingredient.all
respond_to do |format|
format.js
format.html
if params[:ingredientList]
@userIngredient = IngredientsUser.new
@userIngredient.ingredient_id = params[:ingredientList][:value]
@userIngredient.quantity = params[:ingredientList][:quantity]
@userIngredient.user_id = @user.id
if @userIngredient.save
flash[:success] = "Ingredient saved!"
else
@userIngredient.errors.full_messages.each do |error|
flash[:alert] = error
end
end
end
end
端
我不知道我是否犯了错误(可能是因为不工作)或者我忘了添加一些东西。你们中的任何人都知道如何解决这个问题吗?
答案 0 :(得分:0)
我说这不知道你的app/views/ingredients/index.js
文件是什么样的,但我认为你几乎是正确的。
只要在控制器中调用format.js
和format.html
,它就会继续呈现相应的视图(例如:a pp/views/ingredients/index.js
)。 format.js
和format.html
之后的任何代码只会在 AFTER 后执行。
所以在你的情况下,所发生的是渲染是在实际处理输入之前完成的(初始化成分,试图保存它,......)。尝试将format.js
和format.html
移动到操作代码的末尾:
def index
@user = User.find_by id: session[:user_id]
@ingredients = Ingredient.joins(:ingredients_users).where("user_id = ?", session[:user_id]).select("*")
@user_id = session[:user_id]
@ingredient = Ingredient.all
respond_to do |format|
if params[:ingredientList]
@userIngredient = IngredientsUser.new
@userIngredient.ingredient_id = params[:ingredientList][:value]
@userIngredient.quantity = params[:ingredientList][:quantity]
@userIngredient.user_id = @user.id
if @userIngredient.save
flash[:success] = "Ingredient saved!"
else
@userIngredient.errors.full_messages.each do |error|
flash[:alert] = error
end
end
end
format.js
format.html
end
end
所有这些都说明了,你违反了&#34; Rails惯例。索引操作应主要用于获取一系列对象。保存数据应该通过创建(如果是新记录)或更新操作(如果它更改为现有记录)。< / p>