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 :(得分:4)
虚拟属性
您可能会在您的模型中使用attr_accessor
这会创建一个虚拟属性,其作用与模型中的“真实”属性相同:
#app/models/word.rb
Class Word < ActiveRecord::Base
attr_accessor :column_name
end
这将允许您为此属性分配值,该值不会保存到数据库中,这听起来像您想要的那样:
#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