Rails3渲染来自另一个控制器的动作

时间:2010-12-09 14:30:57

标签: ruby-on-rails ruby-on-rails-3

我想从另一个控制器渲染一个动作,但是我得到了错误:

nil的未定义方法`formats':NilClass

<script>
$("#validate_company").live("keyup", function() {
 $("#company_info").html("<%= escape_javascript(render(:controller => 'live_validation', :action => 'validate_client_company')) %>");
});
</script>

这是控制器:

class LiveValidationsController < ApplicationController

def validate_client_company
  if params[:first_name].length > 0
    @client = Client.find_by_company(params[:company])
    if @client.nil?
      @message = "<img src='/images/accepted_48.png' alt='Valid Username'/>"
    else
      @message = "<img src='/images/cancel_48.png' alt='Invalid Username' /> Name taken"
    end
  else
    @message = ""
  end
  render :partial => "message"
end

end

部分_message只是

<%= @message %>

4 个答案:

答案 0 :(得分:2)

render :action => 运行关联的控制器方法。

它只是呈现Rails默认情况下与该操作相关联的模板。也就是说,如果动作validate_client_company简单地调用render而不传递任何参数,Rails会在与控制器同名的文件夹中查找模板,并且名称与名称相同那个行动。调用render :action =>只需查找相同的模板并进行渲染。

最好的猜测是Rails找不到名为validate_client_company的模板。我希望不存在,因为操作validate_client_company呈现部分名为message而不是使用该操作的默认名称呈现模板。

在呈现脚本的操作中,您需要设置实例变量,然后在该操作的模板中,您需要使用以下内容:

render :partial => 'live_validations/message'

在较大的MVC堆栈中安装迷你MVC堆栈当然是有意义的,这样您就可以在运行更大的操作中运行子操作。对于此方案,您可能希望查看Cells。但是,您无法单独使用Rails执行此操作。

答案 1 :(得分:2)

你似乎在混淆东西。

你的控制器方法中有html吗?那应该在你看来。对于每个控制器方法,通常会呈现具有相同名称的视图,除非您从控制器方法中明确调用render

您不在控制器中编写html。您在视图中编写html,有时您会有帮助程序以使您的视图更具可读性。

其次,在你的第一段代码中,我希望是一些视图代码。视图在服务器端准备,然后发送到客户端。您可以从视图中渲染另一个视图(部分视图)。但这并不能实时加载数据。

我如何解决这个问题。在您想要动态呈现验证的视图中:

<script>
  $("#validate_company").live("keyup", function() {
    $("#company_info").load("<%= url_for :controller => 'live_validations', :action => 'validate_client_company' %>");
  });
</script>

然后在你的控制器内写下:

class LiveValidationsController < ApplicationController

  def validate_client_company
    if params[:first_name].length > 0
      @client = Client.find_by_company(params[:company])
      @error = @client.nil? ? :valid_username : :invalid_username
    else
      @error = nil
    end
    render :partial => "message", :layout => false
  end

end

app/helper/live_validations_helper.rb内添加方法

def get_validation_message(error)
  if error == :invalid_username
    image_tag('/images/cancel_48.png', :alt => 'Invalid Username') + "Name taken"
  elsif error == :valid_username
    image_tag('/images/accepted_48.png', :alt => 'Valid Username')
  end
end

在您的message视图中,您可以编写如下内容:

<%= get_validation_message(@error) %>

答案 2 :(得分:0)

你可能想要这样的东西:

<script>
$("#validate_company").live("keyup", function() {
 $("#company_info").load("<%= url_for :controller => 'live_validation', :action => 'validate_client_company' %>");
});
</script>

但你的其余代码有点混乱......从控制器内部渲染部分代码?

答案 3 :(得分:0)

让它发挥作用!

<script>
  $("#validate_company").live("keyup", function() {
        $("#company_info").load("/live_validations/validate_client_company",{company:$('#validate_company').val()});
  });
</script>