[英]Ruby On Rails jQuery AJAX Post
好的,在PHP中,我可以在5分鍾內完成。 有了Rails,我完全迷失了。 我是Rails的新手,我需要用它來做更高級的東西然后我現在很舒服。 大家伙決定讓我們從PHP轉到Rails。 所以它的速成課程學習。 娛樂時間..
我從javascript方面了解到使用jquery發布/獲取仍然是一樣的。 然而在紅寶石方面,我完全迷失了。 我需要做什么才能發布/獲取Rails應用程序。 我該如何定義我的控制器? 讓我們從HTML方面說我發布
input1和input2標准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中尋找的想法。
首先,您需要告訴Rails某個頁面可以接受獲取和發布。
在config / routes.rb文件中:
get 'controller/action'
post 'controller/action'
現在可以通過獲取和發布來訪問該控制器中的操作(例如,控制器“用戶”和操作“索引”)。
現在,在您的控制器操作中,您可以查看是否有這樣的獲取或發布:
def index
if request.get?
# stuff
elsif request.post?
# stuff
redirect_to users_path
end
end
獲取將查找與操作名稱對應的文件。 例如,“用戶”控制器的“索引”操作將在app/views/users/index.html.erb
查找視圖文件
但是,帖子通常與重定向一起使用(如上例所示),但並非總是如此。
首先,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為您提供了大量免費服務,因此您可能會發現您所尋找的大部分內容已經存在。
如果你發布一個更具體的例子,你可能會得到更好的建議。 祝好運!
一開始很難理解你必須做“鐵路方式”,因為軌道的整體哲學是強制執行某些標准。 如果你試圖將PHP習慣融入鐵軌套裝中,它就會撕裂。 Rails指南是你最好的朋友......
要更具體地解決您的問題,您應該嘗試從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中獲得真正的優勢。
你應該能夠(可能需要稍微調整一下)使用rails form helper,這樣你的表單視圖只需要像這樣模糊:
(相當於“新”視圖)
<% form_for @responder do |f| %>
<%= f.input_field :field_1 %>
<%= f.input_field :field_2 %>
<%= f.submit %>
<% end %>
隨意要求更多的精確度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.