为表单创建和使用临时属性

时间:2014-06-20 22:05:59

标签: ruby-on-rails ruby forms ruby-on-rails-4

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()中创建一个临时的。

有没有办法做到这一点,还是我必须:语言和:数据库表中的翻译在表单中引用?

1 个答案:

答案 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