0

我正在创建一个 Rails 应用程序,它将接收来自两个模型及其各自表单的输入,然后使用 Mechanize 登录一个网站并在那里执行数百个任务。

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

我不需要关联这两个模型(与类似的 SO 问题不同,它似乎处理嵌套模型)。一旦这个 Mechanize 任务完成,我将从数据库中销毁两个模型的对象。

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

我的问题是:如何在一个网页上获取两个模型的信息并相应地协调控制器?在这种情况下,我可以在一个控制器中创建两个对象吗?(如果没有,那很好,只要有替代方案;我愿意做任何能让它工作的游戏。)

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

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

<%= form_for(@term) do |f| %>
  <div class="field">
   <%= f.label :name %><br />
   <%= f.text_field :name %>
  </div>
  <div class="field">
   <%= f.label :definition %><br />
   <%= f.text_area :definition %>
  </div>
  <div class="actions">
   <%= f.submit %>
  </div>
<% end %>
4

1 回答 1

0

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

<%= 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之类的东西,只需添加一个 each 循环以将术语保存在控制器中。

于 2013-08-12T18:35:42.970 回答