Rails - 将两个下拉框中的值组合到表单提交中的单个值中

时间:2013-01-29 00:24:44

标签: ruby-on-rails

全部,我有两个下拉框,从两个不同的数据库表和一个带有单个提交按钮的表单填充。我的目标是在表单提交时连接两个值,并将单个值写回数据库,并将其写入与模型关联的表单中。

更简单:两个dropboxes允许选择['red','green','blue']和['dog','cat']。用户选择“红色”和“猫”,然后提交按钮会创建一个新记录“红猫”(在blogname模型下)。

整个表格(new.html.erb)代码:

<%= select("subdomainw1", "blognamew1", Subdomainw1.order("blognamew1 ASC").collect {|p| [ p.blognamew1  ] }, {:prompt => 'Select Adjective'}) %>
<%= select("subdomainw2", "blognamew2", Subdomainw2.order("blognamew2 ASC").collect {|p| [ p.blognamew2  ] }, {:prompt => 'Select Noun'}) %>

<%= simple_form_for (@blogname) do |f| %>
 <%= f.button :submit %>
<% end %>

关联的控制器 def create 为:

 def create
    @blogname = Blogname.new(params[:blogname])
    respond_to do |format|
      @blogname.blogname = ?? THIS SHOULD BE A CONCATENATION OF THE VALUES FROM ABOVE SELECTS
        if @blogname.save
        format.html { redirect_to @blogname, notice: 'Blog was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
  end

这里有什么想法吗?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,Rails的方法是在模型中完成它并保持控制器的瘦。

我认为在rails中你最常见的方式就是回调。因此,对于此示例,您可以设置before_validation(如果您不希望在编辑博客时更改它,则可能是before_create)在您的模式中回调,并从其他两个属性中分配您的blogname。

model.rb

before_validation :generate_blogname

def generate_blogname
   self.blogname ||= "#{blognamew1}-#{blognamew2}".parameterize
end

然后在你的控制器中:

 controller.rb

 def create
    @blogname = Blogname.new(params[:blogname])

    respond_to do |format|
       if @blogname.save
        format.html { redirect_to @blogname, notice: 'Blog was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
 end

参数化方法将通过取出特殊字符使其适用于子域。该模型不应该被称为blogname,它应该是一个具有name属性的表博客。所以@blog = Blog.new,然后@ blog.name =“两个子域值”