Рубин на рельсах jQuery AJAX Post - PullRequest
       0

Рубин на рельсах jQuery AJAX Post

3 голосов
/ 28 сентября 2011

Хорошо, в PHP я могу сделать это за 5 минут. С Rails я полностью потерялся. Я так новичок в Rails, и у меня есть требование делать более сложные вещи, чем мне сейчас удобно. Большой парень решил отпустить Rails из PHP. Так что его ускоренный курс обучения. Веселые времена ..

Я понимаю, что со стороны javascript пост / получение с помощью jquery остается неизменным На рубиновой стороне, однако, я полностью потерян. Что мне нужно сделать, чтобы сделать пост / получить доступ к Rails App. Как бы я определил свой контроллер? Допустим, со стороны HTML я публикую

входные и входные2 стандартные jquery $ .post с JSON-запросом на возврат данных. С php я бы сделал простой контроллер вроде:

public function myFormPostData(){
    $errors = "none";
    $errorMsg = "";
    if($_POST['input1'] == ""){$errors = "found"; $errorMsg .= "Input 1 Empty<br>";}
    if($_POST['input2'] == ""){$errors = "found"; $errorMsg .= "Input 2 Empty<br>";}

    if($errors == "found"){ $output = array("error" => "found", "msg" => $errorMsg); }
    else{
        $output = array("error" => "none", "msg" => "Form Posted OK!!"); 
    }
  echo json_encode($output);
}

но в рубине я не знаю, как перевести это понятие. Я открыт для предложений и хороших практик. Признайте, что вышесказанное - очень посредственное исполнение того, что мне нужно сделать, я бы дезинфицировал вещи больше, чем это и все остальное, но это дает представление о том, что я ищу в Rails ..

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Прежде всего, в Rails 3 есть приятная функция под названием respond_with.Вы могли бы проверить этот эпизод Railscast, который говорит об этом.http://railscasts.com/episodes/224-controllers-in-rails-3. Примеры, которые он использует, хороши, если вы имеете дело с ресурсами.

Сказав это, я приведу вам пример с более традиционным подходом.Вам необходимо иметь действие контроллера, которое обрабатывает запросы, принимающие ответы JSON.

class MyController < ApplicationController
  def foo
    # Do stuff here...
    respond_to do |format|
      if no_errors? # check for error condition here
        format.json { # This block will be called for JSON requests
          render :json => {:error => "none", :msg => "Form Posted OK"}
        }
      else
        format.json { # This block will be called for JSON requests
          render :json => {:error => "found", :msg => "My bad"}
        }
      end
    end
  end
end

Убедитесь, что у вас настроен маршрут

post '/some/path' => "my#foo"

Это основные сведения, которые вам понадобятся,Rails дает вам многое бесплатно, поэтому вы можете обнаружить, что многое из того, что вы ищете, уже существует.

Если вы опубликуете более конкретный пример того, что вы пытаетесь сделать, вы можете получить еще лучший совет.Удачи!

2 голосов
/ 28 сентября 2011

Во-первых, вы должны сообщить Rails, что определенная страница может принимать запросы и сообщения.

В вашем файле config / rout.rb:

get 'controller/action'
post 'controller/action'

Теперь к этому действию в этом контроллере (например, «пользователи» контроллера и «индексу» действия) можно получить доступ через посты и посты.

Теперь, в вашем действии контроллера, вы можете узнать, есть ли у вас get или post вроде этого:

def index
    if request.get?
        # stuff
    elsif request.post?
        # stuff
        redirect_to users_path
    end
end

Получает, ищет файл, соответствующий названию действия. Например, действие «index» контроллера «users» будет искать файл представления в app/views/users/index.html.erb

Однако обычно сообщение используется вместе с редиректом (как в приведенном выше примере), но не всегда.

1 голос
/ 29 сентября 2011

сначала трудно понять, что вы должны делать вещи «рельсовым путем», потому что вся философия рельсов состоит в том, чтобы обеспечить соблюдение определенных стандартов. Если вы попытаетесь вписать привычки PHP в рельсовый костюм, он просто разорвется на части. Рельсовые направляющие - ваш лучший друг здесь ...

Чтобы быть более точным в вашей проблеме, вы должны попытаться построить что-то из ActiveModel . ActiveModel позволяет использовать все функции ActiveRecord, кроме тех, которые предназначены для реализации непостоянных объектов.

Итак, вы можете создать, скажем, модель JsonResponder:

class JsonResponder
  include ActiveModel::Validations

  validates_presence_of :input_1, :input_2

  def initialize(attributes = {})
    @attributes = attributes
  end

  def read_attribute_for_validation(key)
    @attributes[key]
  end
end

В вашем контроллере вы теперь создаете новый JsonResponder:

 # this action must be properly routed, 
 # look at the router chapter in rails 
 # guides if it confuses you
 def foo 
     @responder = JsonResponder.new(params[:json_responder])

     respond_to do |format|
       if @responder.valid?
          # same thing as @wizard's solution
          # ...
       end
     end
 end

теперь, если ваши поля ввода пусты, к вашему объекту @responder будут прикреплены ошибки, также как и любые ошибки проверки, которые вы можете получить с объектом ActiveRecord. У этого подхода есть два преимущества:

  • вся ваша логика хранится внутри собственной модели. Если ваш ответ необходимо улучшить позже (например, обработать более сложный запрос) или использовать его с разных контроллеров, то будет очень просто повторно использовать ваш код. Это помогает держать ваши контроллеры худыми , и, таким образом, является обязательным, чтобы извлечь из MVC реальное преимущество.

  • вы должны быть в состоянии (возможно, с небольшой подстройкой) использовать рельсы-помощники форм, так что ваш вид формы должен быть только приблизительно таким:

(в эквиваленте «нового» представления)

<% form_for @responder do |f| %>
   <%= f.input_field :field_1 %>
   <%= f.input_field :field_2 %>
   <%= f.submit %>
 <% end %>

Не стесняйтесь просить о большей точности.

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