ruby 如何将局部变量添加到js.erb文件中的呈现调用

6g8kf2rb  于 2023-04-05  发布在  Ruby
关注(0)|答案(2)|浏览(133)

我从Rails5.0.4应用程序远程调用了js.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') %>" );

当我硬编码partial中的值时,它可以按预期工作,但是当我从这个js.erb文件中将它们作为局部变量输入时,它们不会通过(nil)。值得注意的是,我从一个非远程haml视图渲染partial,它工作得很好。
以下是我尝试过的渲染方法(我知道有些已经过时了,但只是为了检查一下是否正常)

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" }

还有谁对 * 在rails5中从js.erb渲染haml partials * 有问题吗?

编辑:

下面是调用上面的js.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
j2datikz

j2datikz1#

我找到答案了,其实很简单
呈现局部“视图”局部变量:{k1:v1,k2:v2}不会给予你一个局部哈希。它只是定义了局部变量k1和k2,用于你的partial。你不需要从'locals'哈希中提取它们。
呈现“view”局部变量:{k1:v1,k2:v2}确实会给予你一个包含k1,v2的本地哈希。直到你提取它们时,它们才被定义。这种不一致性让我很困惑。我的代码是为它们在本地哈希中而准备的。

lnvxswe2

lnvxswe22#

您没有指定如何调用js.erb,但我建议的最佳方法如下所示。
步骤1 -构建视图
在视图中包含一个带有remote: true选项的链接、表单或按钮
例如

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

第2步-了解路线
:invitationsroute.rb中的资源路由生成以下路由:

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

并且您在提交时视图invitations/new.html.erb中的表单将执行POST请求到url/invitations
AJAX 的解释
在Web开发中,您可以在服务器和客户端之间执行两种类型的请求,Synchronous or asynchronous requests。在同步请求中,客户端/浏览器将向后端服务器执行HTTP request,后端服务器将使用response进行响应。浏览器将停止并开始加载,直到收到完整的响应。
在异步请求中,request and response周期不包括浏览器停止加载。
您的javascript文件只是客户端/浏览器资产管道中包含的一个文件,都是jscssimagesfonts,当用户访问您的http://yourwebsite.xyz页面并向该url执行get请求时,浏览器会下载它们。您的服务器将执行包含所有这些信息的响应。
这样js文件就找不到你的变量,它来自你的server应用程序或者来自你的database中的一个查询。这两件事是分开的,一个是你的服务器,另一个是客户端。
如果你想拥有这个变量,并将其动态添加到客户端/浏览器asynchronously中,那么你需要使用AJAX
需要执行从客户端到后端服务器的get请求,响应将包含json@invitation变量
第3步-构建您的控制器
Rails路由器在/invitations上接收POST请求,并将请求重定向到控制器invitations操作create。参数通过ActionController::Parameters对象params传递。
运行Ruby on Rails的服务器以3种不同的格式响应请求:HTML用于渲染视图JS以在前端执行脚本代码。JS文件invitations/create.js.erb已经由客户端通过资产管道下载,这只是执行它的命令。JSON用于以json发送@invitation对象,它将在/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步-将结果异步附加到页面
invitations/create.js.erb中,您可以包含js代码,并且可以使用invitations#create操作中的示例变量

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

更多关于使用 AJAX 和Rails的信息

相关问题