রিলে অন রুবি: এইচটিএমএল হিসাবে কোনও স্ট্রিং কীভাবে রেন্ডার করবেন?


154

আমার আছে

@str = "<b>Hi</b>"

এবং আমার শ্রুতিতে:

<%= @str %>

পৃষ্ঠায় কী প্রদর্শিত হবে তা হ'ল: <b>Hi</b>যখন আমি সত্যিই চাই তা হাই । এইচটিএমএল মার্কআপ হিসাবে একটি স্ট্রিং "ব্যাখ্যা" করার রুবি উপায় কী?


সম্পাদনা করুন : কেস যেখানে

@str = "<span class=\"classname\">hello</span>"

আমার দৃষ্টিতে যদি আমি করি

<%raw @str %>

এইচটিএমএল উত্স কোডটি হল <span class=\"classname\">hello</span> যেখানে আমি আসলে যা চাই তা হল <span class="classname">hello</span>(ব্যাকস্ল্যাশগুলি ছাড়াই যা ডাবল উদ্ধৃতিগুলি ছাড়ছিল)। এই দ্বিগুণ উদ্ধৃতিগুলি "আনস্কেপ" করার সর্বোত্তম উপায় কী?


আপনি স্ট্রিং পলায়নের জন্য% Q [] বাক্য গঠন ব্যবহার করার বিষয়েও বিবেচনা করতে পারেন। উদাহরণস্বরূপ %Q["quotation marks"] => "\"quotation marks\"" উত্স: en.wikibooks.org/wiki/Ruby_Programming/yntax/… এটি সাহায্য করে কিনা তা জানেন না।
0112

উত্তর:


328

হালনাগাদ

সুরক্ষার কারণে, sanitizeপরিবর্তে এটি ব্যবহার করার পরামর্শ দেওয়া হয় html_safeলিংক


যা ঘটছে তা হ'ল সুরক্ষা ব্যবস্থা হিসাবে, রেলগুলি আপনার জন্য স্ট্রিংটি ছাড়ছে কারণ এতে এতে দূষিত কোড এম্বেড থাকতে পারে। তবে আপনি যদি রেলগুলিকে বলছেন যে আপনার স্ট্রিংটি রয়েছে html_safe, তবে এটি ঠিক এর মধ্য দিয়ে চলে যাবে।

@str = "<b>Hi</b>".html_safe
<%= @str %>

অথবা

@str = "<b>Hi</b>"
<%= @str.html_safe %>

ব্যবহার rawকরে সূক্ষ্ম কাজ করে তবে এটি যা করছে তা হ'ল স্ট্রিংকে স্ট্রিংয়ে রূপান্তর করা, এবং তারপরে html_safe কল করা। যখন আমি জানি যে আমার কাছে একটি স্ট্রিং রয়েছে, আমি সরাসরি html_safe কল করা পছন্দ করি কারণ এটি একটি অপ্রয়োজনীয় পদক্ষেপ এড়িয়ে যায় এবং যা চলছে তা পরিষ্কার করে দেয়। স্ট্রিং-পলায়ন এবং এক্সএসএস সুরক্ষা সম্পর্কে বিশদগুলি এই এসকিস্টেস্টে রয়েছে


ফ্যান্টাস্টিক। এক ঘন্টা সন্ধান করার পরেও কীভাবে এটি করব তা আমি খুঁজে পেলাম না। আপনার উত্তরের জন্য ধন্যবাদ.
সলিল

1
আমি সবসময় ব্যবহার করেছি raw। এই সম্পর্কে জানতে পেরে খুব আনন্দিত!
jmcharnes

ভবিষ্যত থেকে হ্যাঙ্কস দেওয়া =)
কার্লোস

1
নির্বিষ করার অনুযায়ী মুছে ফেলা হবে stackoverflow.com/questions/44575106/...
Youness

16

কাঁচা ব্যবহার করুন :

<%=raw @str >

তবে @ jmort253 যথাযথভাবে বলেছে, এইচটিএমএলটি আসলে কোথায় তা বিবেচনা করুন।


হাই, এই সমাধানটি কেবল একটি সতর্কতামূলক কাজ ব্যতীত কাজ করে: দয়া করে সম্পাদিত প্রশ্নটি দেখুন
টিম

14

আপনি যদি এরুবিসকেrails ব্যবহার করেন - তবে এটি করার সবচেয়ে দুর্দান্ত উপায়

<%== @str >

দ্বিগুণ সমান চিহ্নটি নোট করুন। আরও তথ্যের জন্য এসও সম্পর্কিত প্রশ্ন দেখুন



7

আপনি আপনার সামগ্রীতে আপনার ব্যবসায়িক যুক্তি মিশ্রণ করছেন। পরিবর্তে, আমি আপনার পৃষ্ঠায় ডেটা প্রেরণ এবং তারপরে আপনার যা প্রয়োজন সেখানে ডেটা স্থাপনের জন্য JQuery এর মতো কিছু ব্যবহার করার পরামর্শ দেব।

এটি আপনার HTML টি এটির HTML পৃষ্ঠাগুলিতে রাখার সুবিধা রয়েছে যাতে আপনার ওয়েব ডিজাইনাররা সার্ভার সাইড কোডটি toালাই না করে পরে এইচটিএমএল সংশোধন করতে পারে।

বা আপনি যদি জাভাস্ক্রিপ্ট ব্যবহার করতে চান না, আপনি এটি চেষ্টা করতে পারেন:

@str = "Hi"

<b><%= @str ></b>

কমপক্ষে এইভাবে আপনার HTML এটির যেখানে HTML পৃষ্ঠাগুলিতে রয়েছে।


সমস্যাটি হ'ল, আমার অ্যাপটি এমন একটি ফাইল নিচ্ছে যা খারাপভাবে চিহ্নিত হয়েছে এবং ভিউতে প্রেরণের জন্য এটি রেজিক্সের মাধ্যমে ভাল HTML মার্কআপে "অনুবাদ" করছে। অতএব, এইচটিএমএল মার্কআপ যেটি উত্পন্ন হচ্ছে তা গতিশীল, সুতরাং আমি কোন প্রাইরিটি জানতে পারি না যে কোন ট্যাগগুলি @ @ এর আশেপাশে থাকার কথা। মডেলগুলিতে না থাকলে আমি এই "অনুবাদ" কাজটি কোথায় করব? আমি ভেবেছিলাম আমাদের ভিউগুলিতে বিস্তৃত লজিক কোড থাকার কথা নয়।
টিম

1
এটা সত্যিই মতামত একটি বিষয়। একটি নতুন অ্যাপ্লিকেশন বিকাশ করার সময় আমি যতটা সম্ভব পরিষ্কার করে রাখা পছন্দ করি। তবে প্রায়শই আমাদের অন্যরা আমাদের ছেড়ে চলে গেছে তার সীমাবদ্ধতার মধ্যে কাজ করতে হবে। যদি আপনার ডেটাসোর্স এইচটিএমএল মার্কআপ দেয় তবে সম্ভবত মাইকেল স্টামের সমাধান হিসাবে বর্ণিত "কাঁচা" ব্যবহারের দিকে একবার নজর দিন।
jmort253

1
আপনি যদি কিছু কোডের উত্তরাধিকারসূত্রে সমর্থন পেয়ে থাকেন এবং কোডটিতে এমন ক্ষেত্র রয়েছে যা খারাপ চিন্তাভাবনা বা নকশা দেখায়, তবে এটি আরও রক্ষণাবেক্ষণের জন্য এটি পরিষ্কার করা আপনার দায়বদ্ধতার অংশ। এটি যেমনটি দুর্দান্ত কোড দিয়ে শুরু করা হয়েছিল ঠিক তেমন এটি ছেড়ে দেওয়ার পরেও কাজের দরকার হলে এটি খুঁজে পাওয়ার চেয়ে ভাল রেখে দেওয়া। আমার কাজের অংশটি কিছু উত্তরাধিকারসূত্রে অ্যাপ্লিকেশন পরিচালনা করছে; আমি ভাঙা জিনিসগুলি স্থির না করার ভক্ত, তবে কীভাবে রচিত হয়েছিল সে কারণে এগুলি সহজে বাড়ানো যায়নি। আমাকে বেশিরভাগ ফাংশন কলগুলি আবার লিখতে হয়েছিল তবে এখনকার সাথে কাজ করা খুব সহজ।
টিন ম্যান

জেএস ব্যবহারের অন্য কোনও কারণ না থাকলে আপনি আপনার এইচটিএমএল প্রবৃত্তির জন্য জাভাস্ক্রিপ্ট ব্যবহার করবেন না। অ-জাতীয় ব্রাউজার (হ্যাঁ, সেখানে আপনার সাইটের ভঙ্গ করবে হয় কিছু)।
মার্নেন লাইবো-কোসার

1
অবশ্যই যদি আপনি অ-পালানো সামগ্রীকে মঞ্জুরি দেয় তবে অশুভ মার্কআপটি নিশ্চিত করার জন্য আপনার স্বাচ্ছন্দ্য বজায় থাকে।
ম্যাকারিও

6

অথবা আপনি সিজিআই.উনস্কেপ এইচটিএমএল পদ্ধতি ব্যবহার করতে পারেন ।

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"

0

যেহেতু আপনি অনুবাদ করছেন এবং কোনও ব্যক্তির ক্রিপযুক্ত কোডড ফাইল থেকে আপনার পছন্দসই কোডটি তুলছেন, আপনি কি আপনার রেজেক্সের সাথে কম্বোতে কন্টেন্ট_ট্যাগ ব্যবহার করতে পারবেন?

এপিআই ডক্স থেকে চুরি করে, আপনি এই অনুবাদকৃত কোডটিকে এই জাতীয়ভাবে আলাদা করতে content_tagপারেন:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

আপনার কোডটি না জেনে, এই ধরণের চিন্তাভাবনাটি নিশ্চিত করবে যে আপনার অনুবাদিত কোডটি খুব কম comp


আমি অনুমান করছি_ অনুবাদকৃত পাঠ্যটি ডিভের মধ্যেই আসল বিষয়বস্তু, তাই না? যেমন, উদাহরণস্বরূপ, এটি "হ্যালো ওয়ার্ল্ড!" হবে? ট্রান্সলেটডেক্সটেক্সটে যদি আরও এইচটিএমএল থাকে, যেমন নেস্টেড ডিভস বা স্প্যান? তখন কি আমাকে অনেক বার কন্টেন্ট_ট্যাগ কল করতে হবে?
টিম

এবং ... দুঃখিত তাড়াতাড়ি প্রবেশ করুন ... প্রতিটি নেস্টেড ডিভ / স্প্যান ভিতরে এখনও একটি কন্টেন্ট_ট্যাগ এবং আপনার এখনও এটি সঠিক হওয়া সত্ত্বেও বৈধ করা দরকার? যেহেতু আপনি আপনার অভিনব অনুবাদ ;-) দিয়ে আপনি কী করছেন তা আমরা দেখতে পাচ্ছি না, তাই আমি রেগেক্সটি এইচটিএমএলের 'পিতামাতাদের' উপর থাকলে ... যেমন <ul> হিসাবে আপনি সমস্ত ট্যাগগুলি সন্ধান করছেন তা আমি ধরে নিয়েছি। আপনি ছাপার জন্য সমস্ত পাছাকে বড় পাছার স্ট্রিং হিসাবে রাখবেন না? প্রত্যেকেরই এটি নিজস্ব কন্টেন্ট_ট্যাগ হবে: লি, পাঠ্য সঠিক?
pjammer

0

@str = "<span class=\"classname\">hello</span>" আমার দৃষ্টিতে যদি আমি করি

<%raw @str %> এইচটিএমএল উত্স কোডটি <span class=\"classname\">hello</span>যেখানে আমি সত্যিই চাই তা হল <span class="classname">hello</span>(ব্যাকস্ল্যাশগুলি যা ডাবল> কোটস এড়িয়ে চলেছিল) ছাড়াই। এই দ্বিগুণ উদ্ধৃতিগুলি "আনস্কেপ" করার সর্বোত্তম উপায় কী?

সমাধান: ব্যাকস্ল্যাশ সহ এড়ানো থেকে বাঁচতে একক উদ্ধৃতি (অথবা ডাবলের একক ভিতরে) এর ভিতরে ডাবল কোট ব্যবহার করুন।

@str = '<span class="classname">hello</span>'
<%raw @str %>

0

এইচটিএমএল_সেফ সংস্করণটি রেল 4 এ ভাল কাজ করে ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.