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 Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 32

0
votes
answers
8 views
+10

替代rails集成測試的控制器測試應該始終堅持db?

0

我正在發現與測試流相關的Rails集成測試,並且我有一些關於使用集成測試替換控制器測試(在rails 5中不推薦使用)的行業標準的問題。替代rails集成測試的控制器測試應該始終堅持db?

通常我們有微小的控制器,我們可以獲取參數,調用正確的協作者並準備響應,並且很容易通過直接在控制器對象上嘲諷協作者來測試它。

我很擔心將每個控制器測試遷移到集成測試的開銷,而持久化db。這種情況的標準是什麼?

只測試一條路線/動作而不是完整流程時的標準是什麼?

我們怎麼能代替這個?:

@controller.stubs(:authenticate).returns(true) 
沙发
0
0

集成測試旨在模仿真實用戶。他們打算全面測試整個應用程序。

意見因此而異。對我而言,這意味着你應該完全避免嘲弄/嘲笑。沒有一件事情被嘲諷或嘲笑,一切都完全執行。這意味着我編寫的每個集成測試都要通過輸入用戶名和密碼的實際身份驗證過程。有些步驟是多餘的,是的。

集成測試比單元/控制器測試更慢。切斷驗證步驟可能不會爲您節省足夠的時間從長遠來看有所作爲(無雙關語意圖)。

+0

感謝您的回答!同意一切。在將控制器測試遷移到集成測試時(如Rails 5中所建議的),身份驗證和存儲用戶不會產生差異,但將每個模型存儲在db中會帶來很多開銷。你做了一個軌道集成測試,爲每個控制器動作存儲所有的數據庫? – Jorge

+0

@Jorge我使用燈具/工廠來創建我所需要的當前測試。 –

0
votes
answers
7 views
+10

爲什麼我的單元測試試圖插入一個記錄,當我不問它?

0

我正在使用rails 5和devise。我正在爲我的控制器編寫一些單元測試,但我正在跑到一堵牆上。以下是我正在試圖測試爲什麼我的單元測試試圖插入一個記錄,當我不問它?

# GET /issues/new 
    def new 
    unless user_signed_in? 
     redirect_to new_user_session_path 
    end 
    @issue = Issue.new(stop_onestop_id: params[:stop_id], line_onestop_id: params[:line_id]) 
    end 

這裏的方法就是我寫

# issues_controller_test.rb 
class IssuesControllerTest < ActionDispatch::IntegrationTest 

    include Devise::Test::IntegrationHelpers 

    test "logged in should get issues page" do 
    sign_in users(:one) 
    test_stop_id = 1 
    test_line_id = 1 
    get new_issue_url, params: {stop_id: test_stop_id, line_id: test_line_id} 
    assert_equal test_stop_id, @issue.stop.id 
    assert_equal test_line_id, @issue.line.id 
    assert_response :success 
    end 
end 

然而測試,當我運行它,我得到以下例外...

localhost:Caravan-App davea$ rails test 
Running via Spring preloader in process 9509 
Run options: --seed 48437 

# Running: 

E 

Error: 
IssuesControllerTest#test_logged_in_should_get_issues_page: 
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: users.email: INSERT INTO "users" ("created_at", "updated_at", "id") VALUES ('2017-12-27 19:07:16.234345', '2017-12-27 19:07:16.234345', 298486374) 



bin/rails test test/controllers/issues_controller_test.rb:6 



Finished in 0.320746s, 3.1177 runs/s, 0.0000 assertions/s. 

1 runs, 0 assertions, 0 failures, 1 errors, 0 skips 

沒有我要求創建新記錄的位置,爲什麼我的測試試圖插入一個?

+1

'用戶(:一個)'抓住測試夾具。你有沒有檢查你的'users.yml'夾具文件?你可能會有一些裝置違反了獨特的電子郵件限制。 –

+0

嘗試將'redirect_to new_user_session_path'更改爲'redirect_to new_user_session_path並返回' –

+0

@DerekHopper,使用taht fixture文件進行良好調用。這確實是問題。 – Dave

沙发
0
1

在行sign_in users(:one),users(:one)正在取夾具。看到這告訴我你正在使用一個燈具文件。

您的項目中有一個文件users.yml,它定義了一些用戶進行測試。它看起來像ActiveRecord::RecordNotUnique異常來自那裏。更具體地說,用戶固定裝置似乎違反了對users.email的唯一性約束。

如果您通過爲每個用戶提供一個唯一的電子郵件地址來修復您的users.yml文件,那麼您應該很好。

0
votes
answers
7 views
+10

如何解決「::的ActionView ::模板錯誤(無效字節序列UTF-8):」

1

專家,如何解決「::的ActionView ::模板錯誤(無效字節序列UTF-8):」

我下面一本書的例子建立在回報率我的第一個博客系統。我的操作系統是Win10,Ruby是2.4.2p198,Rails是5.1.4。激活Rails服務器後,我連接到本地主機:3000 /用戶。然後,我會遇到下面的錯誤:

引發ArgumentError中的用戶#指數 顯示C:/Users/joeychou/hello_rails/app/views/layouts/application.html.erb其中線#7提出:

無效的字節序列在UTF-8

而且它強調如下錯誤行:

在軌道上的服務器,該錯誤消息如下:

ActionView::Template::Error (invalid byte sequence in UTF-8): 4: HelloRails 5: <%= csrf_meta_tags %> 6: 7: <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 8: <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> 9: 10:

app/views/layouts/application.html.erb:7:in `_app_views_layouts_application_html_erb___655117387_94495480'

請告知如何解決此問題,以便我可以繼續前進。任何幫助深表感謝!

Regards,Joey

沙发
0
0

我找到了答案!

coffee-script source> = 1.9.0在Windows下無法正常工作。你可以這樣做:gem'coffee-script-source','1.8.0',強制1.8.0,然後發佈包更新coffee-script-source

請參考下面的鏈接瞭解詳情。 Rails ExecJS::ProgramError in Pages#home?

0
votes
answers
7 views
+10

Rails - 使用ActiveRecord :: Enum的參數錯誤

2

我創建了一個模型Tester,整數列爲tester_type,並聲明模型中的enum變量。Rails - 使用ActiveRecord :: Enum的參數錯誤

class Tester < ApplicationRecord 
    enum tester_type: { junior: 0, senior: 1, group: 2 } 
end 

我得到以下錯誤,而試圖創建/初始化該模型中的對象:

ArgumentError: You tried to define an enum named "tester_type" on the model "Tester", but this will generate a class method "group", which is already defined by Active Record.

所以,我試圖改變tester_typetype_of_tester但它拋出同樣的錯誤:

ArgumentError: You tried to define an enum named "type_of_tester" on the model "Tester", but this will generate a class method "group", which is already defined by Active Record.

我已經搜索的解決方案,我發現這個錯誤是一個常數ENUM_CONFLICT_MESSAGEActiveRecord::Enum類,但不能夠找到這個問題的原因。

請幫幫我。

謝謝。

+0

更改emum的名稱,不要使用testers_type這已被rails使用。 – Sunny

+0

我試着將它改爲'type_of_tester',但是它拋出了相同的錯誤。 –

+0

你也可以粘貼該錯誤。 – Sunny

沙发
0
2

在這種情況下,如果你想使用枚舉,你最好將你的標籤重命名爲其他東西。這不僅限於枚舉 - 許多Active Record功能爲您生成方法,通常也沒有辦法選擇退出這些生成的方法。

然後更改groupanother_name

還是應該遵循這也

enum :kind, [:junior, :senior, :group], prefix: :kind 
band.kind_group? 
板凳
0
1

檢查了這一點。它是您遇到問題的選項組。您可以使用前綴選項,因爲在這個崗位

enum options

地板
0
1

提到可以使用:_prefix:_suffix選擇,當你需要定義具有相同的價值觀或你的情況多枚舉,以避免與已定義的方法發生衝突。如果傳遞值爲true,則方法前綴/後綴爲枚舉的名稱。另外,也可以提供一個自定義的值:

class Conversation < ActiveRecord::Base 
    enum status: [:active, :archived], _suffix: true 
    enum comments_status: [:active, :inactive], _prefix: :comments 
end 

採用上述例子中,爆炸和與相關聯的範圍沿着謂詞方法現在前綴和/或相應後綴:

conversation.active_status! 
conversation.archived_status? # => false 

conversation.comments_inactive! 
conversation.comments_active? # => false 

爲了您情況下,我的建議是使用類似:

class Tester < ApplicationRecord 
    enum tester_type: { junior: 0, senior: 1, group: 2 }, _prefix: :type 
end 

然後你就可以使用這些範圍爲:

tester.type_group! 
tester.type_group? # => true 

Tester.type_group # SELECT "testers".* FROM "testers" WHERE "testers"."tester_type" = $1 [["tester_type", 2]] 
# or, 
Tester.where(tester_type: :group) # SELECT "testers".* FROM "testers" WHERE "testers"."tester_type" = $1 [["tester_type", 2]] 
0
votes
answers
7 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
7 views
+10

Ruby on Rails,coffescript中的內化

0

我有一個coffeescript文件用於我的資源之一。看起來內部化在我的coffescript文件中無法正常工作。我希望I18 gem轉換'select'腳本,但它不起作用。Ruby on Rails,coffescript中的內化

的CoffeeScript:

console.log('employee loaded -> '+"<%= I18n.t 'select' %>") 

當我打開瀏覽器控制檯我結束了這樣的文字:

employee loaded -> <%= I18n.t 'select' %> 

en.yml

en: 
    select: 'Select...' 

tr.yml

tr: 
    select: 'Seçiniz...' 

任何建議,

謝謝。

沙发
0
0

也許你忘了添加擴展程序? filename.coffee。 erb

0
votes
answers
7 views
+10

重構代碼如何爲我amTypeError - Angular^5.0

0

我試圖實現此角碼時,得到TypeError。它圍繞Class({constructor:function(){}})生成錯誤。我一直指出這(https://github.com/angular/angular/commit/cac130eff9b9cb608f2308ae40c42c9cd1850c4d),但不知道如何實施解決方案。重構代碼如何爲我amTypeError - Angular^5.0

我很想知道一種替代方案,因爲我是這種編碼技術的新手。

這是我最近購買的一本關於使用導軌,角度爲 和postgres的書籍。謝謝。

import "hello_angular/polyfills"; 

import { Component, NgModule } from "@angular/core"; 
import { BrowserModule   } from "@angular/platform-browser"; 
import { FormsModule   } from "@angular/forms"; 
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; 

var CustomerSearchComponent = Component({ 
    selector: "shine-customer-search", 
    template: ' 
<header>  
    <h1 class="h2">Customer Search</h1>  
</header>  
    ' 
}).Class({ 
    constructor: function() { 
    } 
}); 

var CustomerAppModule = NgModule({ 
    imports:  [ BrowserModule, FormsModule ], 
    declarations: [ CustomerSearchComponent ], 
    bootstrap: [ CustomerSearchComponent ] 
}) 
.Class({ 
    constructor: function() {} 
}); 
沙发
0
0

據我瞭解在上面的鏈接的信息,您必須確定您的組件爲class,並與@Component裝飾裝飾。

@Component({ 
    selector: "shine-customer-search", 
  template: ' 
<header>  
  <h1 class="h2">Customer Search</h1>  
</header>  
 ' 
}) 
export class CustomerSearchComponent { 
  constructor() { 
    } 
} 

編輯

您還可以使用 typescript。當您用 javascript標記您的問題時,這可能是您的問題。

你的模塊看起來就像這樣:

@NgModule({ 
    imports:  [ BrowserModule, FormsModule ], 
    declarations: [ CustomerSearchComponent ], 
    bootstrap: [ CustomerSearchComponent ] 
}) 
export class CustomerAppModule { } 
+0

**您也可以選擇使用打字稿**,不,這不是真的;) – Alex

0
votes
answers
7 views
+10

Rails獲取選擇單選按鈕輸入選項的人數?

0

使用設計,所以在我的模型中,我會有一個問題,回答選擇和提交按鈕。Rails獲取選擇單選按鈕輸入選項的人數?

QUESTION 
ANSWER CHOICE (30) 
ANSWER CHOICE (20) 
ANSWER CHOICE (n) 
ANSWER CHOICE (n) 
SUBMIT 

在提交時,我希望它顯示有多少人選擇了哪個答案選項。

例如,如果有100人,30人挑選第一個,20第二個,等等..我將如何去實現這個在軌道?

一個問題會有多個答案選項,我會以某種方式在select_for標籤中顯示答案選項,但是對於單選按鈕,但我該如何做這個部分,其中應用程序會顯示有多少人選擇了什麼風景?

沙发
0
1

您只需使用COUNTGROUP BY的聚合查詢。

檢查this了。

例如,從Rails文檔:

Person.group(:city).count 
# => { 'Rome' => 5, 'Paris' => 3 } 
+0

Rails應用程序如何知道哪些用戶挑選什麼樣的選擇呢? – mazing

+0

好吧,我假設你在你的模型中有這種關係。檢查你的表單提交是如何實現的(它是如何保存數據的?)。如果還沒有,你必須先做。 –

0
votes
answers
7 views
+10

在瀏覽器中調用oAuth2 api時出現404錯誤

4

我在rails上使用ruby來製作RESTful API,並且還使用門衛來處理身份驗證和授權。正如你所知,門衛生成一些OAuth2 api,而我需要使用的其中兩個是/用戶,這是發送請求和/ oauth /令牌爲我製作令牌。我製作的api,post,get,put作品在郵遞員和android工作室以及網頁瀏覽器中都有。 但門衛生成的post api/users和/ oauth/token在web瀏覽器中不起作用,但在android studio和postman上效果很好。 這讓我感到困惑。我在調用這個api時遇到的錯誤是404,我檢查了服務器上的ruby生產日誌,並且它說沒有路由匹配。這裏的字符串的東西是方法和路線的類型是正確的。在瀏覽器中調用oAuth2 api時出現404錯誤

這是我在reactjs中使用的代碼。我用axios:

var url="http://x.x.x.x/oauth/token"; 
    axios.post(url,{ 
     "username":"1", 
     "password":"password", 
     "grant_type":"password" 
     },{headers:{"Content-Type":"application/json"}}).then((response) => { 
      console.log(response.data); 
     }) 
     .catch((error) => { 
      console.log(JSON.stringify(error)); 
     }); 

而且還使用原始jQuery發出請求並獲得相同的錯誤。我所有的API運作良好execpt這兩個API:

var firstname = document.forms["registerForm"]["first_name"].value; 
    var lastname = document.forms["registerForm"]["last_name"].value; 
    var pass = document.forms["registerForm"]["password"].value; 
    var passconfirm = document.forms["registerForm"]["password_confirmation"].value; 


    var json_data = { 
     "async": true, 
     "crossDomain": true, 
     "url": send, 
     "method": "POST", 
     "headers": { 
      "content-type": "application/json", 
     }, 
     "processData": false, 
     "data": 
     { 
      "user": { 
       "user_name": username, 
       "password": pass, 
       "password_confirmation": passconfirm, 
       "user_type": "admin" 
      }, 
      "profile": { 
       "first_name": firstname, 
       "last_name": lastname 
      } 
     } 
    } 

    $.ajax(json_data).done(function (response) { 
     console.log(response); 
    }); 
    console.log(json_data['data']); 
    console.log(username); 

這段代碼的console.log輸出(JSON.stringify(錯誤));是這樣的:

{"config":{"transformRequest":{},"transformResponse":{},"timeout":0,"xsrfCookieName":"XSRF-TOKEN","xsrfHeaderName":"X-XSRF-TOKEN","maxContentLength":-1,"headers":{"Accept":"application/json, text/plain, */*","Content-Type":"application/json;charset=utf-8"},"method":"post","url":"http://x.x.x.x/oauth/token.json","data":"{"username":"1","password":"password","grant_type":"password"}"},"request":{}} 

我找到請求頭和響應頭到瀏覽器:

Response Header: 

Content-Type  
application/json; charset=UTF-8 
Content-Length 
34 
Connection 
keep-alive 
Status 
404 Not Found 
X-Request-Id  
d593b73f-eec8-41cd-95cd-e4459663358c 
X-Runtime 
0.002108 
Date  
Mon, 13 Nov 2017 11:19:26 GMT 
X-Powered-By  
Phusion Passenger 5.1.11 
Server 
nginx/1.12.1 + Phusion Passenger 5.1.11 


Request headers (427 B) 
Host  
x.x.x.x 
User-Agent 
Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/56.0 
Accept 
text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8 
Accept-Language 
en-US,en;q=0.5 
Accept-Encoding 
gzip, deflate 
Access-Control-Request-Method 
POST 
Access-Control-Request-Headers 
Origin 
http://localhost:3000 
Connection 
keep-alive 
+0

你能分享錯誤訊息嗎? – aks

+0

這可能與CORS有關,你可以嘗試使用var'url =「http://x.x.x.x/oauth/token.json」'? – aks

+0

是的,我只是添加json到我的端點結束,但它不工作,也做了這個關於CORS的教程這樣的https://enable-cors.org/server_nginx.html並添加到我的代碼 – Sandro

沙发
0
0

檢查他們docs後,它看起來像你需要改變Content-Typeapplication/x-www-form-urlencoded和數據key=value對:

const data = 'username=1&password=password&grant_type=password'

或者乾脆:

const formData = { 
    username: '1', 
    password: 'password', 
    grant_type: 'password', 
} 

const data = Object.keys(formData) 
    .map(prop => `${prop}=${formData[prop]}`) 
    .join('&') 

最終的結果將是:

var url="http://x.x.x.x/oauth/token"; 

axios.post(url, data, { 
    headers: { 
    "Content-Type": "application/x-www-form-urlencoded" 
    } 
}).then((response) => { 
    console.log(response.data); 
}) 
.catch((error) => { 
    console.log(JSON.stringify(error)); 
}); 
+0

我測試了你的方式,但沒有解決,我在WWW-Authenticate中得到了一個響應,其中描述了Bearer realm =「Doorkeeper」,error =「invalid_request」,error_description =「該請求缺少必需參數,包含不受支持的參數值或者格式錯誤「。 – Sandro

+0

@Sandro他們的文檔也提到發送('grant_type','client_id','client_secret','code' ..)你發送這些道具嗎? – mersocarlin

板凳
0
0

您需要在您的OAuth設置以配置爲允許訪問客戶端的Web應用程序。檢查您在api響應中獲得的日誌或錯誤消息。

+0

@Sandro你有沒有找到任何解決方案? – Fawaz

+1

不,我仍在搜索,其中一名senoir開發人員說,它可以從門衛回調url中,但我不知道如何在門衛中配置回調url。門衛有一些關於回叫的理論文本,但沒有關於它的技術文件。不知道該怎麼做 – Sandro

0
votes
answers
6 views
+10

更新操作觸發插入查詢?

0

嗨,我知道這很愚蠢,但我真的得到這個時,我編輯任何條目。更新操作觸發插入查詢?

我有一個費用模型和一個expense_line_item和一個paid_line_item模型,它創建正確,當我創建一個新的條目,但在編輯以前的條目它增加了一個新的條目,而不是更新,我。即在更新操作時,它觸發插入查詢。這裏是我的代碼:

我的控制器:

def new 
     @menu = 'Expenses' 
     @page_name = 'Record New Expenses' 
    @expense = Expense.new 
     @expense.expense_line_items.build 
     @expense.paid_line_items.build 
     @expense.voucher_number = "EXP"+Time.now.to_i.to_s 
     @from_accounts = TransactionType.fetch_from_accounts(current_company.id, 'payments') 
     @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'payments') 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @expense } 
    end 
    end 

    # GET /expenses/1/edit 
    def edit 
    @menu = 'Expenses' 
    @page_name = 'Edit Expenses Entry' 
    @expense = Expense.find(params[:id]) 
     @from_accounts = TransactionType.fetch_from_accounts(current_company.id, 'payments') 
     @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'payments') 
    end 

    # POST /expenses 
    # POST /expenses.xml 
    def create 
    @expense = Expense.new(params[:expense]) 
     @expense.created_by = current_user.id 
     @expense.company_id = current_company.id 

    respond_to do |format| 
     if @expense.save 
     format.html { redirect_to(@expense, :notice => 'Expense was successfully created.') } 
     format.xml { render :xml => @expense, :status => :created, :location => @expense } 
     else 
     @menu = 'Expenses' 
     @page_name = 'Record New Expenses' 
       @from_accounts = TransactionType.fetch_from_accounts(current_company.id, 'payments') 
       @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'payments')     
     format.html { render :action => "new" } 
     format.xml { render :xml => @expense.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /expenses/1 
    # PUT /expenses/1.xml 
    def update 
    @expense = Expense.find(params[:id]) 

    respond_to do |format| 
     if @expense.update_attributes(params[:expense]) 
     format.html { redirect_to(@expense, :notice => 'Expense was successfully updated.') } 
     format.xml { head :ok } 
     else 
     @menu = 'Expenses' 
     @page_name = 'Edit Expenses Entry' 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @expense.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

我的模型:

expense model: 


class Expense < ActiveRecord::Base 
     has_many :expense_line_items 
     has_many :paid_line_items 

     accepts_nested_attributes_for :expense_line_items, :reject_if => lambda {|a| a[:account_id].blank? } , :allow_destroy => true 
     accepts_nested_attributes_for :paid_line_items, :reject_if => lambda {|a| a[:account_id].blank? }, :allow_destroy => true 

     #validations 
     validates_presence_of :expense_date, :voucher_number 
     validates_presence_of :expense_line_items 
     validates_associated :expense_line_items 
     validates_presence_of :paid_line_items 
     validates_associated :paid_line_items 


    end 

expense_line_item:

class ExpenseLineItem < ActiveRecord::Base 
    belongs_to :expense 
end 

paid_line_item:

class PaidLineItem < ActiveRecord::Base 
    belongs_to :expense 
end 

我的形式:

<%= form_for(@expense) do |f| %> 

<% @expense.expense_line_items.each_with_index do |expense_line_item, index| %> 
         <%= render "expense_line_items", :expense_line_item => expense_line_item, :index => index %> 
        <% end %> 
        <tr id="row_link" valign="top"> 
         <td valign="top" colspan="6"> 
          <%= link_to "Add new row",{:action => :add_row, :index => @expense.expense_line_items.size}, :remote => true %> 
         </td> 
        </tr> 
<% @expense.paid_line_items.each_with_index do |paid_line_item, index| %> 
        <%= render "paid_line_items", :paid_line_item => paid_line_item, :index => index %> 
        <% end %> 
        <tr id="to_row_link" valign="top"> 
        <td valign="top" colspan="6"> 
         <%= link_to "Add new row",{:action => :add_to_row, :index => @expense.paid_line_items.size}, :remote => true %> 
        </td> 
        </tr> 
<% end %> 

我很沮喪,在此先感謝。

+0

上面的代碼我沒有看到任何明顯的錯誤。控制器看起來沒問題,所以問題可能在於傳遞給更新的@params。如果沒有看到其他觀點,我們無法確定這些參數是什麼。你可以發佈他們嗎? (expense_line_item和paid_line_item的意見) – u2622 2012-02-11 03:00:05

+0

你可以在更新函數的開頭添加「raise params.inspect」並粘貼輸出嗎? – Rahul 2012-02-11 04:32:43

+0

謝謝@rahul我發現這個錯誤是由於我忘記在我的訂單項中添加的代碼。我必須爲我的訂單項添加一個隱藏的ID字段。感謝您的支持。 – Ravindra 2012-02-22 08:47:03

沙发
0
0

我發現了這個問題的解決方案。當我嘗試更新一個lineitem時,它將它作爲一個新的,因此我必須通過隱藏的lineitem_id更新操作。我有下面的代碼使用 :

<%= hidden_field_tag "expense[expense_line_items_attributes][#{index}][id]",expense_line_item.id%> 

,它爲我工作。