Rails3 рендеринг действий от другого контроллера - PullRequest
0 голосов
/ 09 декабря 2010

Я хочу сделать действие с другого контроллера, но я получаю сообщение об ошибке:

неопределенный метод `format 'для nil: 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 ]

2 голосов
/ 09 декабря 2010

Вы, кажется, путаете вещи.

У вас есть 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 голосов
/ 09 декабря 2010

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.

0 голосов
/ 11 декабря 2010

Работай!

<script>
  $("#validate_company").live("keyup", function() {
        $("#company_info").load("/live_validations/validate_client_company",{company:$('#validate_company').val()});
  });
</script>
0 голосов
/ 09 декабря 2010

Вы, вероятно, хотите что-то вроде этого:

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

Но остальная часть вашего кода в некотором роде испорчена ... Визуализация частичного изнутри контроллера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...