我正在学习使用padrino和haml,我在使用远程表单时会遇到这种奇怪的行为。用于创建元素的部分用作魅力,但更新后使用的部分以纯文本呈现。我确定这是一个新手的错误,但我似乎无法找到它。
#user.rb
get :show, :with => :id do
@user = User.get(params[:id].to_i) #REWRITE
@posts = @user.posts
session[:user_id] = @user.id
render 'user/show'
end
#post.rb
put :update, :with => :id, :provides => :js do
@post = post.first(:id => params[:post][:id].to_i, :user_id => session[:user_id].to_i)
@post.attributes(:name => params[:post][:name], :up => params[:post][:up],
:down => params[:post][:down])
if @post.save
render 'post/update'
end
end
#show.haml
#show
.user
.title= link_to @user.login, url_for(:user, :show, :id => @user.id)
.date= time_ago_in_words(@user.created || Time.now) + ' ago'
.password= @user.password
#posts= partial 'post/list', :locals => { :posts => @user.posts }
#_post.haml
.post{:id => "post#{post.id}"}
.name= post.name
.date= time_ago_in_words(post.created || Time.now) + ' ago'
- if post.up
.up +
- if post.down
.down -
= link_to "(x)", url(:post, :destroy, :id => post.id, :format => :js, :method => 'delete'), :confirm => "Sure?", :remote => true
= link_to "(e)", url(:post, :edit, :id => post.id, :format => :js), :remote => true
#_edit.haml
- form_for :post, url(:post, :update, :id => @post.id, :format => :js), :remote => true, :method => 'put', :id => 'post_edit_form' do |f|
= partial 'post/form', :locals => {:f => f}
= f.text_field :id, :hidden => true
= f.submit "Edit", :class => 'button'
#update.js.haml
:plain
alert("ok");
点击编辑按钮后,我得到一个白页:alert(“ok”);为什么update.js.haml页面没有呈现为远程js?
WEBrick日志:
DEBUG - TEMPLATE (0.0003s) /habit/update.js
DEBUG - PUT (0.0170s) /habit/update/1.js - 200 OK
答案 0 :(得分:1)
很抱歉这些问题长期无人问津。
您遇到的问题是update.js.haml
正在指示Haml将其呈现为纯文本而不是脚本标记内。这就是为什么浏览器永远不会运行它;您应该使用:javascript
代替,如下所示:
#update.js.haml
:javascript
alert("ok");
无论如何,大多数时候你会想要引用外部资产,即真正的JS文件。如果你需要在加载时引导带有一些数据的那些,你可以查看替代方法,例如注入包含变量的脚本标记,该变量将设置初始数据并在应用程序中使用它(有不同的方法)。或者,您可以通过AJAX或WS加载该数据,请记住,这会创建更多与服务器的连接,并可能让用户等待,因此,如果数据需要在加载时准备就绪,如果您是,那么这不是一个好方法正在建立SPA。