在一个控制器操作中处理两个无关联的Rails模型的表单

时间:2013-08-12 17:53:21

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 mechanize rails-activerecord

我正在创建一个Rails应用程序,它将从两个模型及其各自的表单中获取输入,然后使用Mechanize登录到一个网站并在那里完成数百个任务。

第一种形式包括用户的登录信息(用户名和密码,使用模型User),第二种形式包含一长串术语名称及其各自的定义(使用模型{{1并作为Excel文档上传到表单中。

我没有必要将这两个模型联系起来(与类似的SO问题不同,这些问题似乎与嵌套模型有关)。一旦此Mechanize任务完成,我将从数据库中销毁两个模型的对象。

应用程序的两个部分(登录到网站;上传术语并使用它们与网站交互)都可以在单独的脚本中完美运行。

我的问题是:我如何在一个网页上接收两个模型的信息并相应地协调控制器?在这种情况下,我可以在一个控制器中创建两个对象吗? (如果不是,那就没关系,只要有另一种选择;我可以通过游戏来实现这一目标。)

我在下面发布了一些代码。我很乐意回答您的任何问题。请记住我在Rails上很新,所以代码不是很优雅:

Term型号:

User

class User < ActiveRecord::Base attr_accessor :username, :password end 模型:

Term

在我的class Term < ActiveRecord::Base attr_accessible :name, :definition end 控制器中(表单位于terms操作中,脚本在index操作中运行):

show

def create @term = Term.new(params[:term]) @user = User.new(params[:user]) if (@term.save && @user.save) flash[:notice] = "Your terms have been sent for processing." redirect_to terms_path else render :action => 'index' end end def show @term = Term.all agent = Mechanize.new page = agent.get('www.myurl.com') #log into the website @user.username = myform.field_with(:id => "userfield").value @user.password = myform.field_with(:id => "passfield").value #and then enter the term information into the website's forms rest of Mechanize code goes here... end

views/terms/index.html.erb

#the login form: <%= render 'loginform' %> #the term file uploader: <%= form_tag import_terms_path, multipart: true do %> <%= file_field_tag :file %> <%= submit_tag "Import" %> <% end %> <br> <table id="terms"> <tr> <th>Name</th> <th>Definition</th> </tr> #displays the uploaded terms on the index page <% @terms.each do |term| %> <tr> <td><%= term.name %></td> <td><%= term.definition %></td> </tr> <% end %> </table> <p><%= link_to 'Update website with these terms', terms_update_terms_path %></p>

views/terms/_loginform.erb

并在 <%= form_for(@user) do |f| %> <div class="field"> <%= f.label_tag(:username, 'Username') %><br /> <%= f.text_field_tag(:user, :username) %> </div> <div class="field"> <%= f.label_tag(:password, 'Password') %><br /> <%= f.password_field_tag(:user, :password) %> </div> <% end %>

views/terms/_termform.html.erb

1 个答案:

答案 0 :(得分:0)

如果您只需要保存数据并且真的不想关联模型,我会单独保存条款:

<%= form_for @user do |f| %>
    <div class="field">
      <%= f.label :username, 'Username' %>
      <%= f.text_field :username %>
    </div>
    <div class="field">
      <%= f.label :password %>
      <%= f.password_field :password %>
    </div>
    <div class="field">
      <%= label_tag :name %>
      <%= text_field_tag :name %>
    </div>
    <div class="field">
      <%= label_tag :definition %>
      <%= text_field_tag :definition %>
    </div>
    <div class="actions">
      <%= f.submit %>
    </div>
<% end %>

然后在你的控制器中:

@term = Term.new

@term.attributes = {
:name => params[:name],
:definition => params[:definition]
}

@term.save

如果要向表单添加多个术语字段,我会考虑Cocoon之类的内容,只需添加一个循环来保存控制器中的术语。