Rails呈现部分不使用@instance_variable

时间:2013-12-12 05:12:08

标签: ruby-on-rails ruby-on-rails-4 renderpartial

我正在尝试渲染部分内容,但它没有使用我的@user_name变量。在控制器中渲染局部时,是否需要做一些特殊的操作才能传入变量?

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

这是我的用户#new controller:

  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

2 个答案:

答案 0 :(得分:1)

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

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

<强> new.js.erb

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

您正在渲染的部分内容可以访问您传递的@variables

答案 1 :(得分:0)

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

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

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

if params[:show_log_in] == "true"

此外,在JS响应中呈现HTML部分并不好。我不确定这是否有效但合法的方式是呈现js.erb文件。