Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 60

0
votes
answers
34 views
+10

設計寶石註冊模型問題

0

我有一個年齡檢查我的用戶,如果他們想註冊我的應用程序,他們必須是一定的年齡。我使用的是設計寶石,但在我的用戶模型中創建了一個方法來檢查年齡......我得到一個錯誤,指出無論我想要做什麼,都不能因爲一個零級。基本上我有一個用戶,但用戶的birth_date沒有保存。設計寶石註冊模型問題

這告訴我,我把這個邏輯放在哪裏是錯誤的地方。但我不知道在哪裏。我有一個註冊控制器和一個用戶控制器。我也有用戶模型。我沒有註冊模型,我想知道我的方法是否需要使用不同的模型,而我沒有?或者,如果我構建不正確。

我的用戶模型

class User < ActiveRecord::Base 
    before_create :age_restriction 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    def age_restriction 
    if (self.birth_date&.to_date + 18.years) < Date.today # assuming dob format is mm/dd/yy 
     errors.add :birth_date, 'must be older than 18' 
    end 
    end 
end 

我的註冊模式

Cass RegistrationsController < Devise::RegistrationsController 
    before_action :configure_sign_up_params, only: :create 
    before_action :configure_account_update_params, only: :update 

    protected 

    def configure_sign_up_params 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:bith_date, :first_name, :last_name]) 
    binding.pry 
    end 

    def configure_account_update_params 
    devise_parameter_sanitizer.permit(:account_update, keys: [:birth_date, :first_name, :last_name]) 
    end 
end 

斷點我在那裏,當我在devise_parameter_sanitizer型我得到

@permitted= 
    {:sign_in=>[:email, :password, :remember_me], 
    :sign_up=> 
    [:email, :password, :password_confirmation, :bith_date, :first_name, :last_name], 
    :account_update=>[:email, :password, :password_confirmation, :current_password]}, 
@resource_name=:user> 
沙发
0
0

錯字。目前,它是:bith_date。將其修復爲birth_date,模型應該能夠讀取正確的屬性。

這是零,因爲你檢查self.birth_date,而您允許的參數是:bith_date

在sign_up_params允許:birth_date

+0

哦,男人......非常感謝你! – kdweber89

0
votes
answers
24 views
+10

爲第一次用戶訪問做些什麼,直到訪問時間結束爲止

0

我有一個rails應用程序,其中我在每個頁面上顯示通知,並且僅在用戶第一次訪問我的應用程序時顯示。爲此我使用cookie。爲第一次用戶訪問做些什麼,直到訪問時間結束爲止

application_controller.rb

before_action :first_time_visit, unless: -> {cookies[:first_visit]} 
def first_time_visit 
cookies.permanent[:first_visit] = 1 
@first_visit = true 
end 

我用@first_visit變量在我application.html.erb文件來檢測,如果這是用戶的第一次訪問。問題在於如果用戶繼續瀏覽不同的頁面(在第一次訪問中),則通知消失,因爲它不再是「first_visit」。我想顯示通知,直到「第一次訪問者」瀏覽我的應用程序。只有在用戶關閉瀏覽器並返回後,才能再次發送此通知(它不再是first_visit,也不是正在進行的用戶瀏覽會話)。

我該如何在rails中做到這一點?

沙发
0
0

所以,下面的代碼爲我工作。

if cookies[:first_visit] != "1" 
    cookies.permanent[:first_visit] = 1 
    cookies[:first_session] = 1 
    @first_visit = true 
    else 
    if !cookies[:first_session].blank? 
     @first_visit = true 
    else 
     @first_visit = false 
    end 
end 

基本上,關鍵是,在有史以來第一次訪問中,我創建了一個永久cookie。所以,即使在我關閉瀏覽器之後,這仍然會保持不變,而且我維護一個名爲「first_session」的cookie,它是一個臨時cookie,一旦瀏覽器關閉,就會被銷燬。因此,直到第一次第一次訪問時,「first_session」cookie纔可用,因此我能夠顯示我的通知。 另一方面,當用戶關閉了broser並稍後回來時,名爲「first_visit」的cookie已經是「1」,因此沒有向用戶顯示通知。

希望這可以幫助尋找類似用例的人!

0
votes
answers
27 views
+10

與同一模型的關聯

0

我有兩個模型'Product'和'Variant',產品有很多變體,現在我必須設置一個名爲「Ingridient」的變體的新模型的關聯,Variant有很多種ingridients.but在ingridents我想表明它再次HAS_ONE產品和variant.for例如與同一模型的關聯

class Variant 
    has_many :ingridients 
    belongs_to :product 
end 

class Ingridient 
belongs_to :variant 
belongs_to :product 
end 

現在我ingrident模型我也想在同一time.how HAS_ONE變種和HAS_ONE產品應設置我的協會。我知道與同一個表的多個關聯,但不知道如何在我的應用程序中實現它。使用mongoid作爲我的數據庫。

編輯:其實在我的流程用戶可以創建一個產品有很多變種,然後每個變種可以有多個ingridients.In.In每個ingrident我有選擇產品和變種形式數據庫的選擇框.means ingridients將包括產品a變量,數量等字段。爲了使它更清晰Iam製作食譜 。

+0

爲什麼你需要'has_one'?您可以通過從「Ingredient」內部調用'self.variant'來訪問相同的變體。兩者有何不同? –

+0

實際上在我的數據流中,我acn創建一個產品有多個變體,然後我有多個ingridients每個varients.and在ingridients我有一個選擇框從databse.so再次選擇product_name和variant_name每個ingridient應包括一個產品和一個變體。 –

+0

這不能用'belongs_to'完成嗎? –

沙发
0
0

我不是100%清楚你想做什麼。

但是它看起來像是你想與一個不同的名稱關聯。

class Variant 
    has_many :ingridients, :foreign_key => 'FieldName', :class_name => 'CassName' 
    belongs_to :product, :foreign_key => 'FieldName', :class_name => "CassName" 
end 

class Ingridient 
belongs_to :variant, :foreign_key => 'FieldName', :class_name => "CassName" 
belongs_to :product, :foreign_key => 'FieldName', :class_name => "CassName" 
end 

我希望這有助於

+0

是的你的答案非常接近我想要的。但我可以有像變種has_many:ingridents和在同一ingrident belongs_to:變種,也belongs_to:變種,forign_key =>'Fieldname',:class_name =>「Classname」 ? –

0
votes
answers
27 views
+10

沒有ID哈特爾找不到用戶軌教程

2

我有問題,我在軌 我從railstutorial.org學習項目,我在上市的有問題?6.18 所以這是回購 https://github.com/Mroczeks/first_project 這是錯誤:沒有ID哈特爾找不到用戶軌教程

rails test 
Running via Spring preloader in process 10776 
Started with run options --seed 33787 

FAIL["test_schould_be_valid", UserTest, 0.6801217989996076] 
test_schould_be_valid#UserTest (0.68s) 
     Expected false to be truthy. 
     test/models/user_test.rb:9:in `block in <class:UserTest>' 

ERROR["test_email_addresses_should_be_saved_as_lower-case", UserTest, 0.6879979369996363] 
test_email_addresses_should_be_saved_as_lower-case#UserTest (0.69s) 
ActiveRecord::RecordNotFound:   ActiveRecord::RecordNotFound: Couldn't find User without an ID 
      test/models/user_test.rb:45:in `block in <class:UserTest>' 

FAIL["test_email_validation_should_accept_valid_addresses", UserTest, 0.7056386839994957] 
test_email_validation_should_accept_valid_addresses#UserTest (0.71s) 
     "[email protected]" should be valid 
     test/models/user_test.rb:32:in `block (2 levels) in <class:UserTest>' 
     test/models/user_test.rb:30:in `each' 
     test/models/user_test.rb:30:in `block in <class:UserTest>' 

    18/18: [=================================] 100% Time: 00:00:00, Time: 00:00:00 

Finished in 0.78367s 
18 tests, 29 assertions, 2 failures, 1 errors, 0 skips 
+0

「test/models/user_test.rb」文件中有什麼? –

+0

模型用戶測試(名稱,電子郵件和通過bcrypt)所以我測試例如密碼是空的或具有指定數量的字符。 – Drekoo

+0

https://github.com/Mroczeks/first_project/blob/master/test/models/user_test.rb – Drekoo

沙发
0
3

此錯誤的原因似乎user_test.rb文件保存@user對象時要失敗驗證。試着用下面的代碼替換這個測試並運行這個測試時,你會看到驗證失敗:

test "email addresses should be saved as lower-case" do 
    mixed_case_email = "[email protected]" 
    @user.email = mixed_case_email 

    # Calling `save!` here will raise an exception if failed to save @user. 
    @user.save! 
    assert_equal mixed_case_email.downcase, @user.reload.email 
end 

解決您的setup方法相應地滿足所有驗證,再嘗試。

板凳
0
3

User模式,你必須defined password length validation爲6作爲最小的,但在測試設置,created the userpassword: 'pies'。因此,你讓所有的錯誤和失敗:

FAIL["test_schould_be_valid", UserTest, 0.6801217989996076] 
test_schould_be_valid#UserTest (0.68s) 
    Expected false to be truthy. 
    test/models/user_test.rb:9:in `block in <class:UserTest>' 

要解決所有的錯誤,你需要在UserTest#setup初始化有效數據的用戶。在這種情況下,您只需提供一個最小長度爲6的密碼。

0
votes
answers
24 views
+10

提取文本多次

-1

我有一個樣本文本數據如下:提取文本多次

1; ABC; 111; 10-NOV-2017 2; abc; 222; 11-NOV-2017 3; ABC; 333; 12-NOV-2017

鑑於2個輸入ABC11 nov1017我想提取字符串之間的兩個,即

如何使用regex得到結果?有沒有其他辦法可以達到同樣的效果?

實際的數據是這樣的:

113434;軸黃金ETF; 2651.2868; 2651.2868; 2651.2868; 20-NOV-2017 113434;軸黃金ETF; 2627.6778; 2627.6778; 2627.6778; 21-新手覺得2017年 113434;軸黃金ETF; 2624.1880; 2624.1880; 2624.1880; 22 - 11月 - 2017年

任何幫助,高度讚賞。謝謝!

+0

和你嘗試過什麼 – revo

+0

我試過數據[/ #{ 'ABC;'}。(*?)#{'; 11-nov1017'}/m,1]但它的返回; 111; 10-nov-2017 2; abc; 222;即第一個abc和11-nov1017之間的數據 – Imran

沙发
0
1

以下是提取所需子字符串(如果存在)的兩種方法。我們給出以下內容。

str = "1;abc;111;10-nov-2017 2;abc;222;11-nov-2017 3;abc;333;12-nov-2017" 
before_str = "abc;" 
date_str = ";11-nov-2017" 

我假設的date_str值出現在str最多一次。

#1使用正則表達式

r =/
    .*   # match any number of characters greedily 
    #{before_str} # match the content of the variable 'before_str' 
    (.*)   # match any number characters greedily, in capture group 1 
    #{date_str} # match the content of the variable 'date_str' 
    /x   # free-spacing regex definition mode 
    #=> /.*abc;(.*);11-nov-2017/x 

str[r,1] 
    #=> "222" 

這裏的關鍵是.*在正則表達式的開始。作爲一個貪婪的匹配,它會導致下一個匹配成爲"abc;"(的值before_str)的前一個??(值爲date_str)的最後一個實例。

#2確定用於期望subtring的開始和結束索引

idx_date = str.index(date_str) 
    #=> str.index(";11-nov-2017") => 31 
idx_before = str.rindex(before_str, idx_date-before_str.size) 
    #=> str.rindex("abc;", 27) => 24 
str[idx_before + before_str.size..idx_date-1] 
    #=> str[24+4..31-1] => str[28..30] => "222" 

如果任idx_dateidx_beforenilnil將被返回,並且最後一個表達式不進行評估。

查看String#rindex,特別是可選的第二個參數的功能。

(有人可能會寫str[idx_before + date_str.before...idx_date],但我發現在範圍內使用三個點的是錯誤的潛在來源,所以我總是用兩個點。)

+0

完美!說得通。謝謝。 – Imran

板凳
0
0

你可以看看結果: /abc(.*?)10-nov-2017/g.exec("1;abc;111;10-nov-2017 2; abc; 222; 11-nov-2017 3; abc; 333; 12-nov-2017「)[1]

124
votes
answers
21 views
+10

Using Rspec, how do I test the JSON format of my controller in Rails 3.0.11?

I've scoured the web, but, alas, I just can't seem to get Rspec to correctly send content-type so I can test my JSON API. I'm using the RABL gem for templates, Rails 3.0.11, and Ruby 1.9.2-p180.

My curl output, which works fine (should be a 401, I know):

mrsnuggles:tmp gaahrdner$ curl -i -H "Accept: application/json" -X POST -d @bleh http://localhost:3000/applications
HTTP/1.1 403 Forbidden 
Content-Type: application/json; charset=utf-8
Cache-Control: no-cache
X-Ua-Compatible: IE=Edge
X-Runtime: 0.561638
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Tue, 06 Mar 2012 01:10:51 GMT
Content-Length: 74
Connection: Keep-Alive
Set-Cookie: _session_id=8e8b73b5a6e5c95447aab13dafd59993; path=/; HttpOnly

{"status":"error","message":"You are not authorized to access this page."}

Sample from one of my test cases:

describe ApplicationsController do
  render_views
  disconnect_sunspot

  let(:application) { Factory.create(:application) }

  subject { application }

  context "JSON" do

    describe "creating a new application" do

      context "when not authorized" do
        before do
          json = { :application => { :name => "foo", :description => "bar" } }
          request.env['CONTENT_TYPE'] = 'application/json'
          request.env['RAW_POST_DATA'] = json
          post :create
        end 

        it "should not allow creation of an application" do
          Application.count.should == 0
        end 

        it "should respond with a 403" do
          response.status.should eq(403)
        end 

        it "should have a status and message key in the hash" do
          JSON.parse(response.body)["status"] == "error"
          JSON.parse(response.body)["message"] =~ /authorized/
        end 
      end 

      context "authorized" do
      end 
    end
  end
end

These tests never pass though, I always get redirected and my content-type is always text/html, regardless of how I seem to specify the type in my before block:

# nope
before do
  post :create, {}, { :format => :json }
end

# nada
before do
  post :create, :format => Mime::JSON
end

# nuh uh
before do
  request.env['ACCEPT'] = 'application/json'
  post :create, { :foo => :bar }
end

Here is the rspec output:

Failures:

  1) ApplicationsController JSON creating a new application when not authorized should respond with a 403
     Failure/Error: response.status.should eq(403)

       expected 403
            got 302

       (compared using ==)
     # ./spec/controllers/applications_controller_spec.rb:31:in `block (5 levels) in <top (required)>'

  2) ApplicationsController JSON creating a new application when not authorized should have a status and message key in the hash
     Failure/Error: JSON.parse(response.body)["status"] == "errors"
     JSON::ParserError:
       756: unexpected token at '<html><body>You are being <a href="http://test.host/">redirected</a>.</body></html>'
     # ./spec/controllers/applications_controller_spec.rb:35:in `block (5 levels) in <top (required)>'

As you can see I'm getting the 302 redirect for the HTML format, even though I'm trying to specify 'application/json'.

Here is my application_controller.rb, with the rescue_from bit:

class ApplicationController < ActionController::Base

 rescue_from ActiveRecord::RecordNotFound, :with => :not_found

  protect_from_forgery
  helper_method :current_user
  helper_method :remove_dns_record

 rescue_from CanCan::AccessDenied do |exception|
    flash[:alert] = exception.message
    respond_to do |format|
      h = { :status => "error", :message => exception.message }
      format.html { redirect_to root_url }
      format.json { render :json => h, :status => :forbidden }
      format.xml  { render :xml => h, :status => :forbidden }
    end 
  end

  private

  def not_found(exception)
    respond_to do |format|
      h = { :status => "error", :message => exception.message }
      format.html { render :file => "#{RAILS_ROOT}/public/404.html", :status => :not_found }
      format.json { render :json => h, :status => :not_found }
      format.xml  { render :xml => h, :status => :not_found }
    end
  end
end

And also applications_controller.rb, specifically the 'create' action which is what I'm trying to test. It's fairly ugly at the moment because I'm using state_machine and overriding the delete method.

  def create
    # this needs to be cleaned up and use accepts_attributes_for
    @application = Application.new(params[:application])
    @environments = params[:application][:environment_ids]
    @application.environment_ids<<@environments unless @environments.blank?

    if params[:site_bindings] == "new"
      @site = Site.new(:name => params[:application][:name])
      @environments.each do |e|
        @site.siteenvs << Siteenv.new(:environment_id => e)
      end
    end

    if @site
      @application.sites << @site
    end

    if @application.save
      if @site
        @site.siteenvs.each do |se|
          appenv = @application.appenvs.select {|e| e.environment_id == se.environment_id }
          se.appenv = appenv.first
          se.save
        end
      end
      flash[:success] = "New application created."
      respond_with(@application, :location => @application)
    else
      render 'new'
    end

    # super stinky :(
    @application.change_servers_on_appenvs(params[:servers]) unless params[:servers].blank?
    @application.save
  end

I've looked at the source code here: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/responder.rb, and it seems it should respond correctly, as well as a number of questions on stack overflow that seem to have similar issues and possible solutions, but none work for me.

What am I doing wrong?

up vote 59 down vote accepted favorite
沙发
+590
+50

嘗試在請求的params散列中移動:format 鍵,如下所示:

  describe ApplicationsController do render_views disconnect_sunspot let(:application){Factory。 create(:application)} subject {application} context“JSON”描述“創建新應用程序”做上下文“未經授權時”做“不應該允許創建應用程序”do params = {:format =&gt; 'json',: application =&gt; {:name =&gt; “foo”,:description =&gt; “bar”}} post:create,params Expect(Application.count).to eq(0)expect(response.status).to eq(403)expect(JSON.parse(response.body)[“status”]) .to eq(“
     
			
        

剛剛查看了控制器代碼!我改變了一點測試!試試看! - 亞瑟·內維斯12月3日在3:19

不幸的是,根據api.rubyonrails.org/classes/ActionController/TestCase/,這也無濟於事。如果不指定Content-Type或Accept標頭,Rails將默認為text / html。與此curl語句類似:curl -i -X POST -d'{:application => {:name =>“foo”,:description =>“bar”}}'http:// localhost:3000 / applications - gaahrdner 12年3月6日3:33

@gaahrdner嘗試將格式設置為參數!多數民眾贊成我的API rspec測試!它正在工作!我沒有使用Content-Type或Accept - Arthur Neves 3月6日在3:37

啊哈!成功!這完全有效,它也適用於前塊。非常感謝Arthur! - gaahrdner 12年3月6日3:54

+650

我意識到設置:format =&gt; :json 是一種解決方案(如上所述)。但是,我想測試客戶端到API的相同條件。我的客戶端不會設置:format 參數,而是設置 Accept HTTP標頭。如果您對此解決方案感興趣,請使用以下內容:

  #api / v1 / test_controller_spec.rb require'spec_helper.rb'描述Api :: V1 :: TestController do render_views context“當請求集accept =&gt; application / json“do it”應該返回成功響應“do request.accept =”application / json“get:test response.should be_success end end end  
     
			
        

只需添加request.accept =“application / json”解決了我的問題。這似乎是最簡單的解決方案。謝謝! - user3233065 2014年1月24日19:54

Rails 4和Rspec 3.2.1解決了同樣的問題--Jason Yost於2015年3月9日7:44

Rails4和Rspec3.3以及 - Yo Ludke 2015年8月19日12:07

48
votes
answers
12 views
+10

Difference between plugins and Ruby gems?

What is the difference between plugins and gems? What are the different uses of each? Where and why would you use one over the other?

up vote 39 down vote accepted favorite
沙发
+390
+50

寶石

  • Gem是一個使用RubyGems定義的打包系統的打包ruby應用程序
  • Rails本身就是一個寶石。

    Rails gem還安裝在JRuby的1.0lib ubygems1.8gems苦惱的-1.2.3:

    DIR
    DIR 內置
    68465 CHANGELOG
    DIR CONFIGS
    DIR 調度
    DIR DOC
    DIR 環境
    307 fresh_rakefile
    DIR 助手
    DIR HTML
    DIR LIB
    1072 MIT許可證
    11969 Rake文件
    8001自述
    的lib目錄包含所有gem源代碼。

  • 我們可以安裝,升級和查詢gem版本。如果使用像我的GemInstaller這樣的工具,可以使用一個簡單的配置文件輕鬆地自動安裝和加載RubyGems。

  • 安裝了Ruby解釋器的Gem可以由該解釋器在系統範圍內使用。
  • Gem可以作為插件發布。
  • 也可以在供應商/寶石中出售。

插入

  • 插件是Rails框架的擴展。
  • 無法使用命令升級。升級一個必須卸載然後安裝升級版本。
  • 必須要迷上rails應用程序。(必須有init.rb)
  • 有一個install.rb文件。
  • 插件無法作為Gem發布。
  • 只能在應用範圍內使用。

Goldspike插件安裝在vendorplugins ails-應用程序的集成目錄中:
7,089 build.xml
1,141 LICENSE.txt
DIR 插件
6,675 pom.xml
1,447 README
DIR 示例
插件/ goldspike目錄包含
24個init.rb
25 install.rb
DIR lib
549 Rakefile
536 README
DIR 任務
DIR 測試
lib目錄包含所有插件源代碼。

寶石vs插件

  • Rails有一種從vendor / plugins /目錄加載插件的方法。這很可能會棄用,因為Rails已經添加了對與gem / gems /目錄中的項目捆綁gems的支持。rspec的gem版本是用於日常使用的版本。除非您在1.2.x系列或更早版本中支持Rails應用程序,否則應該使用它們。
  • 使用Gems登記和簽出存儲庫通常會變得更快,因為您不在實際應用程序中包含庫。使用與分佈式團隊中軟件版本不兼容的插件相關的插件通常較少。
  • 一般的經驗法則是將Rails特定的功能作為插件,同時將更多通用的Ruby庫轉換為gem。

thanks @Piyush. Can you tell me, the use of Plugins and Gems. And then, Why/where we use the Plugins and Gems. Please explain with real time concept. – Mr. Black Apr 2 '11 at 4:55

hi @user409617, now a days its all plugins what everybody use. so both became almost same. but i personally prefer plugins since i can view the code inside the plugin and know exactly whats happening. (not that gems cant, but its bit of a hassle) :D – sameera207 Apr 2 '11 at 5:14

@sameera207 I disagree, I believe that the vast majority of Rails applications use gems rather than plugins these days. Some people do vendor their gems, though, or install them in a path relative to the project via Bundler. – Michelle Tilley Apr 2 '11 at 5:25

@Brandon sorry, actually I wanted to say 'gems' insted of 'plugins'. so the wording should be corrected as 'now a days its all gems what everybody use'... sorry again :D – sameera207 Apr 2 '11 at 6:28

what are those numbers "68,465" before "CHANGELOG" – hatenine Mar 2 '15 at 20:20

+90

Gems安裝在系統級別,而插件安裝在應用程序級別。這意味著如果兩個或多個應用程序在同一台服務器上運行,它們可以共享寶石,但每個應用程序都有自己的插件。現在我建議使用寶石,因為隨著應用程序的擴展,它們更容易維護。

I disagree, Because we should not install gems system wide because it might pollute and crash my application. In addition to that, will tell one scenario. What will happened if One VPS have many app and if the gems would install as system wise it will crash, So for this we should create Gemset for each and every application. Use Gemset for Rails app. – VKatz Sep 24 '16 at 7:11

0
votes
answers
23 views
+10

如何在AMP分析中包含自定義變量?

2

幾個月前,我們將AMP引入了我們的Rails應用程序。我們的實現包括以下內容:如何在AMP分析中包含自定義變量?

<amp-analytics type="googleanalytics"> 
    <script type="application/json"> 
    { 
    "vars": { 
     "account": <%= ga.profile_code.inspect.html_safe %> 
    }, 
    "triggers": { 
     "trackPageview": { 
     "on": "visible", 
     "request": "pageview" 
     } 
    } 
    } 
    </script> 
</amp-analytics> 

然而,我們現在認識到,我們缺少其在谷歌Analytics(分析)腳本我們的非AMP的網頁中使用的一些重要的自定義變量。

<% ga.variables.each do |vars| %> 
    _gaq.push([ '_setCustomVar', <%= vars[:placement] %>, '<%= vars[:label] %>', '<%= vars[:variable] %>', <%= vars[:scope_number] %> ]); 
    <% end %> 

是否有可能在AMP Analytics(分析)設置自定義變量,而無需在變量名任何限制:這些如下(其中_gaq是一個數組)的腳本中設置?如果是這樣,怎麼樣?

沙发
0
2

您應該注意,Custom Variables僅適用於舊版Google Analytics分析跟蹤。對於最新的實現,您將需要用自定義維度替換您的自定義變量。您可以查看移植指南HereHere。您可以檢查implementation of sending custom dimensions and custom metrics in AMP page

例如,您可以通過發送 與瀏覽量的自定義維度,包括自定義維度參數(或您 想命中包括任何其他參數)在extraUrlParams部分。此 部分可包含在觸發級別的單個請求中,或在全局級別 上發送包含所有請求的數據。

<amp-analytics type="googleanalytics"> 
<script type="application/json"> 
{ 
    "vars": { 
    "account": "UA-XXXXX-Y" 
    }, 
    "extraUrlParams": { 
    "cd3": "AMP" 
    }, 
    "triggers": { 
    "trackPageviewWithCustomData": { 
     "on": "visible", 
     "request": "pageview" 
    }, 
    "trackEvent" : { 
     "on": "visible", 
     "request": "event", 
     "vars": { 
     "eventCategory": "ui-components", 
     "eventAction": "header-click" 
     }, 
     "extraUrlParams": { 
     "ni": "1" 
     } 
    } 
    } 
} 
</script> 
</amp-analytics> 
+0

謝謝本。我們會試一試。 –

0
votes
answers
27 views
+10

如何讓控制器中的用戶信息在rails中

0

我需要在帖子表中存儲user_id(對於每個新帖子)。我從表單中將user_id作爲hidden_??field傳遞。從控制器本身獲取user_id的替代方法是什麼?如何讓控制器中的用戶信息在rails中

在控制器

def create 
    @post [email protected](post_params).save 
end 

樁模型

class Post < ApplicationRecord 
    belongs_to :topic, counter_cache: true 
    belongs_to :user 
    has_and_belongs_to_many :users # to maintain read and unread status for the posts 
    has_many :comments , dependent: :destroy 
    has_many :ratings , dependent: :destroy 
    has_and_belongs_to_many :tags 
    end 

形式

<%= form_for [@topic, @post],remote: true,html: { multipart: true} do |form| %> 

    <div class="field"> 
     <%= form.label :author %> 
     <%= form.text_field :author, :value => current_user.email %> 
    </div> 

     <%= form.label :content %> 
     <%= form.text_area :content, id: :post_content, autofocus: true %> 

    <!--<%= form.hidden_field :user_id %>--> 

<div class="field"> 
    <%=form.label :image%><br> 
    <%=form.file_field :image %> 
</div> 

    <%= form.fields_for :tags do |a|%> 
    <div class="field"> 

     <%= a.label :tag_name %> 
     <%= a.text_area :tag_name %> 
    </div> 
    <% end %> 
    <div class="field"> 
     <%= form.label "select tag" %> 
     <%= form.collection_select(:tag_ids, Tag.all, :id, :tag_name, {}, {:multiple => true, :size => 10, :prompt_text => "select tag"}) %> 
    </div> 


    <div class="submit"> 
     <%= form.submit %> 
    </div> 
<% end %> 
+0

你是如何保持在用戶簽訂了當前的軌跡?你能發表表格代碼嗎? – xeon131

+0

你如何存儲用戶?你使用'devise'寶石嗎? –

+0

@ xeon131我已添加表單代碼 – Aarthi

沙发
0
0

您可以使用current_user的控制器,如下面,

def create 
    @topic.posts.new(post_params).save 
end 

private 

def post_params 
    params.require(:post).permit(...).merge(user: current_user) 
end 

def create 
    @topic.posts.new(post_params.merge(user: current_user)).save 
end 
0
votes
answers
24 views
+10

登錄後重定向到首頁

0

在這裏反應新手。 我有一個應用程序與反應和軌道建成。在主頁上有一個登錄鏈接。將用戶帶到登錄頁面。在驗證用戶名是否存在時,我正嘗試使用下面的代碼重定向到主頁。登錄後重定向到首頁

export default class Login extends React.Component { 

    constructor(props) { 
     super(props); 
     this.state = { 
      username: '', 
      isValid: false 
     }; 
     this.handleSubmit = this.handleSubmit.bind(this); 
     this.handleChange = this.handleChange.bind(this); 
    } 

    handleSubmit(event) { 
     axios.get('/isuser/'+this.state.username) 
      .then(res => { 
       this.setState({ isValid: true }); 
      }) 
      .catch(function (error) { 
       console.log(error); 
      }); 
     event.preventDefault(); 
    } 

    handleChange(event) { 
     this.setState({username: event.target.value}); 
    } 

    render() { 
     if (this.state.isValid) { 
      return <Redirect to={{ 
         pathname: '/', 
         state: { 
           username: this.state.username, 
           loggedIn: true 
         } 
       }}/> 
     } 
     return (
       <div> 
       //form 
       </div> 
     ); 
    } 
} 

但是,道具是空的。我使用下面的代碼來獲取它。

export default class LoginLink extends React.Component { 

    constructor(props) { 
     super(props); 
     if(this.props.state == undefined) { // always empty 
      this.state = {loggedIn: false, redirect: false}; 
     } 
     else { 
      this.state = { 
         loggedIn: this.props.location.state.loggedIn, 
         username: this.props.location.state.username 
      }; 
     } 
     this.handleOnClick = this.handleOnClick.bind(this); 
    } 

    handleOnClick(event) { 
     this.setState({redirect: true}); 
     event.preventDefault(); 
    } 

    render() { 
     if (this.state.redirect) { 
      return <Redirect to={{ 
         pathname: '/login' 
        }}/> 
     } 
     else { 
      if (this.state.loggedIn) { 
       return (
        <ul className="nav navbar-nav navbar-right" id="topnav"> 
         <li><a href="">{this.state.username}</a></li> 
        </ul> 
       ); 
      } 
      else { 
       return (
        <ul className="nav navbar-nav navbar-right" id="topnav"> 
         <li> 
          <Button bsStyle="link" onClick={this.handleOnClick}>Log in</Button> 
         </li> 
        </ul> 
       ); 
      } 
     } 
    } 
} 

這裏是我的路線:

<main> 
    <Switch> 
    <Route exact path='/' component={Home}/> 
    <Route path='/login' component={Login}/> 
    </Switch> 
</main> 

我不知道是否有某種形式的無限循環的(調用超)。 任何幫助表示讚賞。

+0

避免變異的狀態,首先,使用'this.setState();',而不是'this.state()'什麼是你想要''的組件? – Aaqib

+0

@Aaqib你可以在構造函數中做到這一點 – mjwatts

+0

@Archana是重定向組件的構造函數 - 它不清楚嗎? – mjwatts

沙发
0
0

在構造函數中返回不同的狀態並不是很好的做法。因爲組件的狀態結構還不清楚。我建議是這樣的:

constructor(props) { 
    super(props); 
    this.state = { 
    loggedIn: props.location.state.loggedIn || false, 
    username: props.location.state.username || null, 
    } 
} 

然後在render()功能

render() { 
    // if loggedIn go to '/' 
    if (this.state.loggedIn) { 
    return <Redirect to={{ pathname: '/', state: { ...this.state, loggedIn: true } }} /> 
    } 
    // otherwise 
    // return something else or Redirect to login... 
} 
+0

Hi IIan, 我已經更新了代碼。你現在可以看看嗎? – Archana