2013-12-12 92 views
0

我想渲染一个部分,但它不使用我的@user_name变量。当你在控制器中渲染一个局部变量时,你需要做一些特殊的事情来传递变量吗?Rails渲染部分不使用@instance_variable

看看Rails指南,我没有看到任何说@instance_variables将不可用的部分。

这里是我的用户#新的控制器:

def new 
    if signed_in? 
     redirect_to current_user 
    else 
     @user = User.new 
    end 

    # Used to show "log in" instead of "sign up" on render. Set in URL request. 
    if params[:show_log_in] == true 
     @show_log_in = true; //???? doesn't seem to get passed into partial. 
    end 

    respond_to do |format| 
     format.html {} 
     # JS is used for modal windows when this is accessed asynchronously. 
     # e.g. a button is clicked that requires user to be signed in. 
     format.js { render "shared/_signup_modal.html.erb" } //???? @show_log_in doesnt seem to get passed in? 
    end 
    end 

回答

0

在控制器中定义的实例变量将在视图中可用,包括部分。毫无疑问。但问题不在这里。

问题是关于paramsparams值都在String中。因此,评估if params[:show_log_in] == true是错误的,并且始终返回false,并且定义的实例永远不会发送。

您需要将其作为字符串进行比较。

if params[:show_log_in] == "true" 

此外,在JS响应中呈现HTML部分是不好的。我不确定这是否会起作用,但合法的方法是渲染js.erb文件。

+0

谢谢比利!我会研究js.erb。 – EmilyNeedsToCode

1

你需要传递变量。在你的respond_to块中,你需要format.js {@show_log_in}。但我通常使用respond_torespond_with。它更漂亮。

然后,您必须在您的视图中进行调整。

new.js.erb

$('#selector').html("<%= j render partial: 'shared/_signup_modal' %>"); 

你呈现有将有机会获得你通过它的@variables的部分。