使用ajax和rails

时间:2016-11-14 18:17:26

标签: ruby-on-rails ajax

所以,我有一个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

我不知道我是否犯了错误(可能是因为不工作)或者我忘了添加一些东西。你们中的任何人都知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我说这不知道你的app/views/ingredients/index.js文件是什么样的,但我认为你几乎是正确的。

只要在控制器中调用format.jsformat.html,它就会继续呈现相应的视图(例如:a pp/views/ingredients/index.js)。 format.jsformat.html之后的任何代码只会在 AFTER 后执行。

所以在你的情况下,所发生的是渲染是在实际处理输入之前完成的(初始化成分,试图保存它,......)。尝试将format.jsformat.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>