2015-07-21 100 views
0

我想使用人造活動記錄(在db中沒有持久性的模型)。軌道人造活動記錄

我跟着這個例子: https://quickleft.com/blog/using-faux-activerecord-models-in-rails-3/

而且我有這樣的錯誤:

引發ArgumentError在SearchController#新 錯誤的參數數目(2 1)

應用程序/模型/搜索。 rb:32:在assign_attributes' app/models/search.rb:27:in初始化' app/controllers/search_controller.rb:4:在new' app/controllers/search_controller.rb:4:in新'

它看到毫秒,當你打電話Search.new它需要參數,但我的目標是使其成爲一個空的搜索對象。

這裏是我的模型,控制器,視圖,路線:

型號

class Search 

    include ActiveModel::MassAssignmentSecurity 

    TRUE_VALUES = ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES 

    attr_accessor :query 
    attr_reader :safe_search, :results_per_page 

    alias_method :safe_search?, :safe_search 

    attr_accessible :query, :safe_search, :results_per_page 

    RESULTS_PER_PAGE = [10, 25, 50, 100].freeze 

    include ActiveModel::Conversion 
    include ActiveModel::Validations 

    validates :query, presence: true 
    validates :results_per_page, presence: true, inclusion: { in: RESULTS_PER_PAGE } 

    def persisted? 
    false 
    end 

    def initialize(attributes = {}) 
    assign_attributes(attributes) 
    yield(self) if block_given? 
    end 

    def assign_attributes(values, options = {}) 
    sanitize_for_mass_assignment(values, options[:as]).each do |k, v| 
     send("#{k}=", v) 
    end 
    end 

    def results_per_page=(value) 
    @results_per_page = value.to_i 
    end 

    def safe_search=(value) 
    @safe_search = TRUE_VALUES.include?(value) 
    end 

end 

控制器

class SearchController < ApplicationController 

    def new 
    @search = Search.new 
    render "search/new.html.erb" 
    end 

    def create 
    @search = Search.new(params[:search]) 

    # TODO: use the @search object to perform a search. Adding 
    # a `results` method on the search object might be a good starting point. 
    end 

end 

查看:搜索/ new.html.erb

<%= form_for @search do |f| %> 

    <%= f.label :query %> 
    <%= f.text_field :query %> 

    <%= f.label :safe_search %> 
    <%= f.check_box :safe_search %> 

    <%= f.label :results_per_page %> 
    <%= f.select_box :results_per_page %> 

<%= end %> 
+0

你爲什麼要重寫Rails的'assign_attributes'方法(doc [here](http://apidock.com/rails/ActiveRecord/AttributeAssignment/assign_attributes))?這似乎與你的錯誤有關。 –

+0

嗨史蒂夫,我認爲作者使用它,因爲它不是一個普通的活動記錄對象。 –

+0

我評論了assign_attributes並初始化它,看看它是否工作,現在我從視圖中看到這個錯誤:#<# undefined方法'sear_path':0x007fca6a4229f8> 提取的源代碼(在第1行附近): 1:<%= form_for @search do | f | %> 2: 3:<%= f.label:query%> 4:<%= f.text_field:query%>。我正在使用我正在使用的路線更新我的問題。 –

回答

0

這裏是我找到了解決辦法: 在模型中,我使用這個:

def initialize(attributes = {}) 
     assign_attributes(attributes) 
    end 

    def assign_attributes(attributes) 
    sanitize_for_mass_assignment(attributes).each do |k, v| 
     send("#{k}=", v) 
    end 
    end 

這裏是在控制器我的新創建方法:

def new 
    @search = Search.new 
    render "search/new.html.erb" 
    end 

    def create 
    @search = Search.new(params[:search]) 
    respond_to do |format| 
     format.html { render :template => "search/create.html.erb" } 
    end 
    end 

順便說一句我必須將我的控制器重命名爲SearchesController,因爲控制器必須複數。

這是我的看法new.html.erb:

<%= form_for @search, url: { action: "create" }, :method => :post do |f| %> 

    <%= f.label :query %> 
    <%= f.text_field :query %> 

    <%= f.label :safe_search %> 
    <%= f.check_box :safe_search %> 

    <%= f.label :results_per_page %> 
    <%= f.select(:results_per_page, [10, 25, 50, 100]) %> 

    <%= f.submit %> 

<% end %> 

我希望這將是給別人用。