我想从另一个控制器渲染一个动作,但是我得到了错误:
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 %>
答案 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>