2014-06-20 46 views
3

Ruby on Rails 4.1爲表單創建並使用臨時屬性

表單有一個選項來選擇表列名稱。我想輸入文本到表格選擇的表格列中。爲了做到這一點,我試圖創建表單可以用來存儲值並在create方法中檢查的臨時屬性。然後將文本分配到正確的列,然後保存。

控制器:

def new 
    @word = Word.new 
    @language = Word.new(params[:language]) 
    @translation = Word.new(params[:translation]) 
    @language_options = Word.column_names 
end 

def create 
    @word = Word.new(word_params) 
    if @language == "arabic" 
    @word.arabic == @translation 
    end 
    respond_to do |format| 
    if @word.save 
     format.html { redirect_to @word, notice: 'Word was successfully created.' } 
     format.json { render :show, status: :created, location: @word } 
    else 
     format.html { render :new } 
     format.json { render json: @word.errors, status: :unprocessable_entity } 
    end 
    end 
end 

形式:

<%= simple_form_for(@word) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 

    <%= f.input :name, placeholder: 'English String' %> 

    <%= f.input :language, collection: @language_options %> 

    <%= f.input :translation, placeholder: 'Translated String' %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

這是錯誤我得到:

undefined method `language' for #<Word:0x007f6116b1bcb8> 

這是因爲沒有對形式語言屬性使用。所以我試圖在控制器new()中做一個臨時的。

有沒有辦法做到這一點或我必須:語言和:翻譯在數據庫表中引用的形式?

+0

使用簡單輸入助手的值。像'text_field'或'select'。 – zishe

+0

另外,在方法'create'' @ language'和'@ translation'中沒有定義。 – zishe

回答

4

虛擬屬性

可以從你的模型中使用的attr_accessor

這將創建一個虛擬屬性它的工作方式相同的「真實」模型中的屬性好處:

#app/models/word.rb 
Class Word < ActiveRecord::Base 
    attr_accessor :column_name 
end 

這將允許您爲此屬性賦值ibute這將不會被保存到數據庫,你想要什麼這聽起來像:

#app/views/words/new.html.erb 
<%= simple_form_for(@word) do |f| %> 
    <%= f.input :column_name do %> 
      <%= f.select :column_name, @language_options %> 
    <% end %> 
<% end %> 

當您提交此表,它就會給你column_name屬性編輯:

#app/controllers/words_controller.rb 
Class WordsController < ApplicationController 
    def create 
     # ... you'll have "column_name" attribute available 
    end 
end 
+1

有趣的是,這是我想要的。在接受答案之前,我會先玩這個。 +1 – DDDD