অন্য কোনও নিয়ামকের মধ্যে ফর্ম তৈরি করুন


128

আমি সাইন_ইন / সাইন_আউট পদ্ধতিগুলির জন্য একটি রত্ন রত্ন ব্যবহার করছি।

আমি ব্যবহার করে কৌতুক থেকে ভিউ ফাইল তৈরি করেছি rails g devise views

আমি দেখেছি একটি নকশাগুলি / সেশনস / new.html.erb ফাইল রয়েছে যা সাইন_ইনের জন্য একটি ফর্ম রয়েছে।

আমি অন্য একটি ফাইল তৈরি / সেশন / _for.html.erb তৈরি করেছি এবং <%= render 'form' %>একটি নতুন.html.erb ফাইলের মধ্যে করেছি এবং এটি খুব সূক্ষ্মভাবে কাজ করেছে।

এখন, আমি এই ফর্মটি বিভিন্ন নিয়ামকের কাছ থেকে অন্তর্ভুক্ত করতে চেয়েছিলাম। সুতরাং 'মেইন' নামে একটি নিয়ামক, (বিশেষত, দেখুন পৃষ্ঠার অভ্যন্তরে) 'মেইনস / ইনডেক্স। Html.erb' আমি <%= render 'devise/sessions/form' %>ফাইল অন্তর্ভুক্ত করেছি । দেখে মনে হয় যে অন্তর্ভুক্তিটি ভাল কাজ করেছে তবে আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি।

NameError in Mains#index

Showing /home/administrator/Ruby/site_v4_ruby/app/views/devise/sessions/_form.html.erb where line #1 raised:

undefined local variable or method `resource' for #<#<Class:0x007f1aa042d530>:0x007f1aa042b870>
Extracted source (around line #1):

1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
2:   <p><%= f.label :email %><br />
3:   <%= f.text_field :email %></p>
4: 

দেখে মনে হচ্ছে যে form_for (উত্স, ...) অংশটি সমস্যা সৃষ্টি করছে (যা আমি মূল নকশার সাইন_ইন পৃষ্ঠায় থাকলে ভাল কাজ করে ... আমি কীভাবে এই সমস্যাটিকে রেলপথে সমাধান করতে পারি?

আমি ব্যক্তিগতভাবে html কোডগুলি ইনলাইন লেখার পরিবর্তে ফর্মটি অন্তর্ভুক্ত করতে 'রেন্ডার' ফাংশনটি ব্যবহার করতে পছন্দ করি।

আমাকে কি 'প্রধান' নিয়ামকের মধ্যে কিছু (সংস্থান) নির্দিষ্ট করতে হবে?

আমি আপনার সাহায্যের প্রশংসা করব। ধন্যবাদ.


কোন সমাধান আছে ...? নভেম্বর / 16 পর্যন্ত আমি রেন্ডার ব্যবহার করে সমাধানটি সত্যিই পাইনি .. যদিও আমি যদি কেবল ইনলাইন কোড টাইপ করি তবে এটি ঠিক কাজ করে বলে মনে হচ্ছে ..
ব্যবহারকারী 482594

আপনি কি এর জন্য কোনও সমাধান খুঁজে পেয়েছেন?
nebz

হ্যাঁ, আমি উত্তরটি বেছে নিয়েছি যা আমার সমস্যার সমাধান করে। এটি আমার ধারণা থেকে সহজ ছিল।
ব্যবহারকারী 482594

উত্তর:


240

অ্যান্ড্রেস যেমন বলেছেন, ফর্মটি কলকারী সহায়ককে কল করে যা ডিভাইস দ্বারা নির্দিষ্ট করা হয় এবং তাই যখন আপনি কোনও ডিভাইস নিয়ামক থেকে কোনও ডিভাইস ফর্মটি অ্যাক্সেস করেন তখন উপস্থিত থাকে না।

এটি পেতে, আপনাকে নীচের পদ্ধতিগুলি যে নিয়ামকের নীচে ফর্মটি প্রদর্শন করতে চান তার সহায়িকা শ্রেণিতে যুক্ত করতে হবে। বিকল্পভাবে, এগুলি যে কোনও জায়গায় উপলব্ধ করার জন্য আপনি এগুলি কেবল আপনার অ্যাপ্লিকেশন সহায়তাতে যুক্ত করতে পারেন।

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end

সূত্র: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/


6
চমৎকার। নিশ্চিত করুন যে এটি সহায়কের মধ্যে রয়েছে, নিয়ামক হিসাবে নয়। এছাড়াও, যদি আপনার অন্যান্য সংস্থান থাকে (উদাহরণস্বরূপ এমন সংস্থাগুলিও লগ ইন করতে পারে) এবং আপনি তাদের ফর্মটি লোড করতে চান তবে এটি বিশাল সমস্যার সৃষ্টি করতে পারে। নামগুলি পুনরায় সংজ্ঞায়িত করা নিশ্চিত করুন এবং রাউটিংটিও সমস্যা হতে পারে।
মাইকেল স্মিটজ

1
এই সমাধানটি সম্পর্কে খারাপ জিনিসটি এটি ভেঙে যায় inherited_resources
jrhorn424

6
এই পদ্ধতির পরিধি সীমাবদ্ধ করতে (এবং অন্যান্য রত্নগুলির সাথে নেমস্পেসের দ্বন্দ্ব এড়ানোর জন্য), উপরের পদ্ধতিগুলি নিজেই নিয়ামকের সাথে যুক্ত করার চেষ্টা করুন helper_method :resource_name, :resource_class, :resource, :devise_mapping( :resource_classনতুন ডিভাইস সংস্করণগুলিতে এটি প্রয়োজনীয় মনে হয়)।
গাঁজলা

1
আমাদের কয়েকটি ছদ্মবেশী মডেল থাকলে কী সমাধান হওয়া উচিত?
yozzz

আমার দুটি ডিভাইস মডেল রয়েছে এবং হোমপেজে উভয়ের জন্য লগইন দরকার। আপনার উত্তর অনুরূপ কিছু করতে কিভাবে কোন ধারণা?
ডিআর_

8

এটিও চেষ্টা করে দেখতে পারেন ... এই প্রশ্নটি পরীক্ষা করে দেখুন ।

উৎস

<%= form_for("user", :url => user_session_path) do |f| %>
  <%= f.text_field :email %>
  <%= f.password_field :password %>
  <%= f.check_box :remember_me %>
  <%= f.label :remember_me %>
  <%= f.submit 'Sign in' %>
  <%= link_to "Forgot your password?", new_password_path('user') %>
<% end %> 

এটি কি সমস্ত উত্তরের সেরা অনুশীলন নয়?
বিত্তুতা

4

আপনি তৈরি ফর্মটি কোনও ডিভাইস নিয়ন্ত্রকের কাছ থেকে রেন্ডার করার সময় কাজ করে কারণ ডিভাইসের মাধ্যমে "সংস্থান" সংজ্ঞায়িত করা হয়। ডিভাইস সেশনস কনট্রোলারের বাস্তবায়নটি একবার দেখুন - আমি যা বুঝি তার থেকে আপনি "নতুন" ক্রিয়াটির অনুলিপি করার চেষ্টা করছেন। "বিল্ড_সোর্স" পদ্ধতিটি সম্ভবত আপনি দেখাচ্ছেন।

ওয়ার্ডেন মণি যেখানে "রিসোর্স" বস্তু থেকে আসছে হয়। আপনি যদি আরও গভীর খনন করতে চান, তবে এটি দেখার জায়গা হবে।


আমি কেবল একটি mains_controller এর সাথে 'build_resource' কল করেছি, তবে এটি [অপরিজ্ঞাত স্থানীয় পরিবর্তনশীল বা পদ্ধতি `build_resource '] ত্রুটি বলে। আমি 'মাইনস_কন্ট্রোলার' শীর্ষে 'ডিভাইস :: কন্ট্রোলার্স :: ইন্টারনাল হেল্পারস' সন্নিবেশ করে অভ্যন্তরীণ সহায়তাকারীকে অন্তর্ভুক্ত করার চেষ্টা করেছি তবে এটি 'অ্যাবস্ট্রাক্ট্রন্ট্রোলার :: অ্যাকশন নটফাউন্ড'
ইউজার 482594

3

গৃহীত উত্তরের উপর পরিমার্জন করতে আমরা বিভিন্ন ধরণের সংস্থানকে অনুমতি দেওয়ার জন্য এই সহায়কটি ব্যবহার করি:

def resource_name
  @resource_name ||= if admin_controller?
    :admin_user
  else
    :user
  end
end

def resource
  @resource ||= resource_name.to_s.classify.constantize.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[resource_name]
end

লগইন পুনর্নির্দেশগুলি পরিচালনা admin_controller?করতে আমাদের কাছে এমন কিছু যেখানে রয়েছে ApplicationController:

def admin_controller?
  !devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?

2

undefined local variable or method "resource"আপনি আমার নিয়ন্ত্রকের একজনের কাছ থেকে বর্ণিত একই ত্রুটিটি পেয়েছিলাম, কারণ আমার নিয়ামক বেস শ্রেণিটি নিম্নলিখিতটি অনুপস্থিত ছিল (রেলস-এপিআই অ্যাকশনকন্ট্রোলার :: এপিআই এর দোষ ছিল):

include ActionController::Helpers

সুতরাং ডিভাইস থেকে সহায়তাকারী পদ্ধতিগুলি ভিউতে সমাধান করা যায় নি।

ডিভাইসকে রেলস-এপিআই দিয়ে কাজ করার জন্য আমাকে অন্তর্ভুক্ত করা দরকার:

class ApplicationController < ActionController::API

  include AbstractController::Rendering
  include AbstractController::Layouts
  include ActionController::MimeResponds
  include AbstractController::Translation
  include ActionController::ImplicitRender
  include ActionController::Helpers
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.