0

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

更简单地说:两个 Dropbox 允许选择 ['red','green','blue'] 和 ['dog','cat']。用户选择“red”和“cat”,提交按钮创建一个新记录“red-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

这里有什么想法吗?

4

1 回答 1

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 = Blog.new,然后@blog.name = “两个子域值”

于 2013-01-29T00:46:20.763 回答