Ruby on RailsでコーディングしたWebページをバックエンドの埋め込み可能にして、ユーザーが埋め込みコードをコピーして貼り付けることで簡単に共有できるようにしたいと思います。(YouTubeの埋め込みコードによく似ていますが、Webページ用です)誰かがチュートリアルや一般的な指示を教えてもらえますか?JoomlaCMSに自分のWebページを埋め込むことを計画しています。
どうもありがとう。
橋脚。
Ruby on RailsでコーディングしたWebページをバックエンドの埋め込み可能にして、ユーザーが埋め込みコードをコピーして貼り付けることで簡単に共有できるようにしたいと思います。(YouTubeの埋め込みコードによく似ていますが、Webページ用です)誰かがチュートリアルや一般的な指示を教えてもらえますか?JoomlaCMSに自分のWebページを埋め込むことを計画しています。
どうもありがとう。
橋脚。
モバイル アプリ ストア用のウィジェットを作成するとします。ウィジェットを使用すると、特定のアプリの情報を任意の Web ページに埋め込むことができます。
タグを使用するscript
と、埋め込み可能なコードは次のようになります。
<script src="http://my_appstore.com/apps/1234.js" type="text/javascript"></script>
1234 は、埋め込みたい特定のアプリの ID になります。
タグを使用するとiframe
、他の Web ページに挿入するコードは次のようになります。
<iframe src="http://my_appstore.com/apps/1234" width="500" height="200" frameborder="0"></iframe>
最初に決めなければならないのは、どの種類のタグを使用するかです。とiframe
タグを使用する方が簡単ですが、iframe の使用に制限されています。iframe を使用することは悪いオプションではありませんが、これをサード パーティの Web ページに配布すると、後で変更することができなくなります。代わりに、script
iframe を挿入するタグを使用することをお勧めします。このタグを使用すると、後でコンテンツを直接ページに埋め込むように切り替えることもできます。
iframe を挿入するということは、コンテンツの縦横比を固定する必要があり、親ウィンドウのさまざまなウィンドウ サイズに合わせて変更できないことを意味します。コンテンツを直接埋め込む場合、この問題は発生しませんが、CSS には細心の注意を払い、すべての要素にスタイルを追加する必要があります。そうしないと、ホスト ページのスタイルが継承されてしまうからです。また、コンテンツを直接埋め込んでから AJAX 呼び出しを行うと、JSONP を使用しない限り、クロスブラウザー リクエストの問題が発生する可能性があります。
まず、 Railsウィジェットを埋め込むために使用するSinatraで簡単な Web ページを作成しましょう。
mkdir host_page
cd host_page
テキスト エディターを使用して、フォルダーhost.rb
内にファイルを作成します。host_page
# host.rb
require 'sinatra'
get '/' do
erb :index
end
index.erb
host_page を作成して起動します。
mkdir views
cat '<script src="http://localhost:3000/apps/1234.js" type="text/javascript"></script>' > views/index.erb
ruby host.rb
訪問http://localhost:4567/
しても何も表示されませんが、すぐにウィジェットが表示されます。
では、埋め込む Rails アプリを作成しましょう。プロジェクトの新しいフォルダーから始めて、次の操作を行います。
rails new widget
cd widget/
rails g controller apps
rm app/assets/javascripts/apps.js.coffee
必要なルートを追加します。
# config/routes.rb
MyApp::Application.routes.draw do
resources :apps
end
アプリ コントローラーを編集します。
# app/controllers/apps_controller.rb
class AppsController < ApplicationController
def show
@mobile_app = {
:title => "Piano Tutorial",
:descr => "Learn to play piano with this interactive app",
:rating => "*****"
}
end
end
そのコントローラーでは、常に同じアプリを返しています。実際の状況では、params で見つかったモデル ID から適切なアプリ データを取得するモデルとコントローラーがあります。
JavaScript ビューを作成し、サーバーを起動します。
echo 'document.write("<h3><%=@mobile_app[:title]%></h3><p><%=@mobile_app[:descr]%></p><p><em><%=@mobile_app[:rating]%></em><p>");' > app/views/apps/show.js.erb
rails server
以上です。http://localhost:4567/
ウィジェットに移動して表示します。
iframeを使用する場合は、show.js.erb
ファイルの内容を次のように置き換えます。
document.write("<%=escape_javascript(content_tag(:iframe, '', :src => app_url(params['id'])).html_safe)%>");
ここでは a を使用していますが、以前のようにタグをcontent_tag
使用するだけで、前の方法と同様の方法で行うこともできます。<iframe>
明らかに、iframe を使用する場合、2 つの呼び出しを行います。1 つは iframe をレンダリングするため、もう 1 つはその iframe のコンテンツをロードするためです。この 2 回目の呼び出しでは、まだ html ビューがありません。そのようなビューを作成するだけです:
# app/views/apps/show.html.erb
<h3><%=@mobile_app[:title]%></h3>
<p><%=@mobile_app[:descr]%></p>
<p><em><%=@mobile_app[:rating]%></em><p>
これで、再びiframehttp://localhost:4567/
内のウィジェットをポイントして表示できます。
誰かがこれに出くわした場合、ほぼ9年後...
JavaScript メソッドを使用する場合は、上記のコメントで言及されている @abessive のように、Cross-Origin リクエストを許可する必要があります。これをコントローラークラスの先頭に追加することで、これを行うことができました。
protect_from_forgery except: :method
は:method
、埋め込みリクエストに対して呼び出されるメソッドです。
これが私のコントローラーです:
class PagesController < ApplicationController
protect_from_forgery except: :home
def home
render 'index.js'
end
end
そして、routes.rb 内の関連するルート:
get "index.js", to: "pages#home"
そして、ウィジェットをレンダリングするJSコードを含むviews/pages/index.js.erbがあります。
(Rails 6.1.4 を使用しています)