代码之家  ›  专栏  ›  技术社区  ›  MingMan

如何将局部变量添加到js中的渲染调用。erb文件

  •  1
  • MingMan  · 技术社区  · 8 年前

    我有我的js。从我的Rails 5.0.4应用程序远程调用erb文件。

    <% if @admin_invitation.present? && @admin_invitation.valid? %>
    <%my_view = j (render partial: "shared/invitation_card",:user => @admin_invitation.invited_id, :email => @admin_invitation.invited_email, :type => "admin" ) %>
    $(".invites.admins .row").prepend("<%=my_view %>");
    <% end %>
    
    App.refresh( "<%= j(render 'shared/alerts') %>" );
    

    当我硬编码部分中的值时,它会像预期的那样工作,但是当我从这个js中以局部变量的形式输入它们时。erb文件,他们没有通过(无)。值得注意的是,我从非远程haml视图渲染部分,效果很好。

    以下是我尝试过的渲染方法(我知道有些已经过时,但只是为了检查一下是否正常)

    render partial: "shared/invitation_card", :locals=> { :email => "admin@gmail.com", :type => "admin" }
    render partial: "shared/invitation_card", object: "admin@gmail.com", as: "email"
    render partial: "shared/invitation_card", email: "admin@gmail.com", type:"admin"
    render partial: "shared/invitation_card", locals: { email: "admin@gmail.com", type: "admin" }
    

    其他人对 从js渲染haml部分。轨道5中的erb

    def create
        if params[:invited_status] == "temporary_invitation_user"
          result = CreateGroupInvitation.call(invitation_model: GroupFollowInvitation, group_id: params[:group_id], inviter: current_user, invited_email: params[:invited_email], notification: "created_group_follow_email_invitation")
        else
          result = CreateGroupInvitation.call(invitation_model: GroupFollowInvitation, group_id: params[:group_id], inviter: current_user, invited_id: params[:invited_id] , notification: "created_group_follow_invitation")
        end
    
        if result.success?
          @invitation = result.invitation
          @invited = params[:invited_id] == "null" ? params[:invited_email] : User.find(params[:invited_id])
          flash.now[:success] = "Your follow invitation was sent"
        else
          if result.error_message.present?
            flash.now[:info] = result.error_message
          else
            flash.now[:error] = "An error happend"
          end
        end
    
        respond_to do |format|
          format.js { render layout: false }
        end
      end
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   fabOnReact    8 年前

    您没有指定呼叫方式 js.erb ,但我建议的最佳方法如下。

    步骤1-构建视图

    remote: true 您视图中的选项

    例如

    <%= form_with(model: @invitation) do |f| %>
    ...
    <% end %>
    

    中的资源路由 route.rb :invitations 生成以下路由:

    new_invitation GET  /invitations/new(.:format) invitations#new                           
                   POST /invitations(.:format)     invitations#create                                      
    

    以及你眼中的你 invitations/new.html.erb POST 请求 /invitations .

    在webdevelopment中,您可以在服务器和客户端之间执行两种类型的请求, Synchronous or asynchronous requests request response . 浏览器将停止并开始加载,直到收到完整响应。

    在异步请求中 request and response

    你的 javascript 文件只是包含在 客户端/浏览器 资产管道,这些都是 js , css , images fonts 当用户访问您的页面时,浏览器会下载这些内容 http://yourwebsite.xyz 并执行 get 请求 url

    因此 文件无法找到您的变量,该变量来自 server 应用程序中的查询 database . 这两件事是分开的,一个是你的服务器,另一个是客户端。

    动态和 asynchronously ,则需要使用 AJAX .

    A. 请求需要从客户端执行到后端服务器,响应将包括 @invitation 中的变量 json 总体安排

    Rails路由器接收 请求时间 并将请求重定向到控制器 invitations 行动 create ActionController::Parameters 对象 params .

    运行Ruby on Rails的服务器以3种不同的格式响应请求: invitations/create.js.erb 已由客户端通过资产管道下载,这只是执行它的命令。 JSON发送 @邀请 格式,可在 /invitations.json

    # app/controllers/invitations_controller.rb
    # ......
    def create
      @invitation = Invitation.new(params[:invitation])
    
      respond_to do |format|
        if @invitation.save
          format.html { redirect_to @invitation, notice: 'Invitation was successfully created.' }
          format.js
          format.json { render json: @invitation, status: :created, location: @invitation }
        else
          format.html { render action: "new" }
          format.json { render json: @invitation.errors, status: :unprocessable_entity }
        end
      end
    end
    

    步骤4-将结果异步附加到页面

    在里面 您可以包含js代码,并且可以使用 invitations#create 行动

    $("<%= escape_javascript(render @invitation) %>").appendTo("#invitations");
    

    more info about working with AJAX and Rails

        2
  •  1
  •   MingMan    8 年前

    我找到了答案。其实很简单

    渲染“视图”局部变量:{k1:v1,k2:v2}会给你一个内部有k1,v2的局部散列。在提取它们之前,它们不会被定义。这种前后矛盾使我感到厌烦。我的代码是为它们准备的,可以放在本地哈希中。