Ruby on Rails:编辑表单不保存新数据

时间:2012-09-28 13:03:16

标签: ruby-on-rails ruby database drop-down-menu

我有一个允许用户创建新项目的页面。他们可以选择链接到表colomn的下拉菜单,选择他们正在寻找的选项已经在数据库中,以及可以输入新数据的另一个选项,即在提交项目时,该字段的新数据将保存到下一个人的数据库中。

这是我的新/编辑项目视图的一部分:

<div class="client">
<%= label_tag :new_client, "Client" %><br/>
<%= text_field_tag :new_client, nil, :maxlength => 30 %>
Or
<%= f.select( :client, Project.all.map {|p| [p.client]}.uniq, :prompt => "Select a previous Client") %>
</div>

用户可以通过文本字段输入新数据,也可以从下拉列表中选择。如果用户在文本框中放入新数据并从下拉列表中选择一些内容,则新数据随项目一起保存,因为它具有优先权。

我的问题在于编辑视图:

当用户点击编辑链接时,项目会显示他们放入的所有数据,但所有数据都保存在下拉菜单中。

如果他们尝试将新数据输入文本框并保存项目,则会使用下拉列表中突出显示的内容保存该项目,并忽略放入文本框中的新数据。

编辑视图与新视图完全相同。

任何人都可以指出我正确的方向。我是rails的新手,所以在尝试帮助时请记住这一点。

提前致谢。

    # GET /projects/1/edit
      def edit
        @project = Project.find(params[:id])
   end

      # POST /projects
      # POST /projects.json
      def create
        @all_technols = Technol.all
        @project = Project.new(params[:project])

    @technol = Technol.new(params[:tech])

    params[:technols][:id].each do |technol|

    if !technol.empty?


        #@project.projecttechnols.build(:technol_id => technol)
    @project_technol = @project.projecttechnols.build(:technol_id => technol)

    end
    end
        @project.client = params[:new_client] unless params[:new_client].blank?

        @project.project_owner = params[:new_project_owner] unless params[:new_project_owner].blank?
        @project.tech = params[:new_tech] unless params[:new_tech].blank?
        @project.role = params[:new_role] unless params[:new_role].blank?
        @project.industry = params[:new_industry] unless params[:new_industry].blank?
        @project.business_div = params[:new_business_div] unless params[:new_business_div].blank?

        respond_to do |format|
          if @project.save
            format.html { redirect_to @project, notice: 'Project was successfully created.' }
            format.json { render json: @project, status: :created, location: @project }
          else
            format.html { render action: "new" }
            format.json { render json: @project.errors, status: :unprocessable_entity }
          end
        end
      end

      # PUT /projects/1
      # PUT /projects/1.json
      # PUT /projects/1
  # PUT /projects/1.json
  def update
    @project = Project.find(params[:id])
    [:client, :project_owner, :tech, :role, :industry, :business_div].each do |attribute|
  params[attribute] = params["new_#{attribute}".to_sym] unless params["new_#{attribute}".to_sym].blank?
end

    respond_to do |format|
      if @project.update_attributes(params[:project])
        format.html { redirect_to @project, notice: 'Project was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

编辑视图:

<h1>Editing project</h1>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>

<%= stylesheet_link_tag "form" %>


<%= form_for(@project) do |f| %>


  <% if @project.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2>

      <ul>
      <% @project.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
<BODY LANG="en-GB" TEXT="#000000" DIR="LTR">
<P LANG="en-US" CLASS="western" ALIGN=RIGHT STYLE="margin-bottom: 0in">
<BR>
</P>
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
</P>

<div class ="padding">
</div>
<CENTER>
    <TABLE WIDTH=624 CELLPADDING=2 CELLSPACING=0 >
        <COL WIDTH=283>
        <COL WIDTH=20>
        <COL WIDTH=152>
        <COL WIDTH=138>
        <COL WIDTH=9>
        <THEAD>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=29 BGCOLOR="#999999" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <H1 LANG="en-US" CLASS="western"><FONT COLOR="#003366"><FONT SIZE=4>
   <div id = "project_name">
<div class="project_name">
    <%= f.label :project_name %> : 
    <%= f.text_field :project_name,:maxlength => 30 %>
  </div>
</div>

</FONT></FONT></H1>
                </TD>
            </TR>
        </THEAD>
        <TBODY>
            <TR>
                <TD COLSPAN=2 WIDTH=307 HEIGHT=15 BGCOLOR="#e6e6e6" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <H2 LANG="en-US" CLASS="western" ALIGN=LEFT>Database id:</H2>
                </TD>
                <TD COLSPAN=3 WIDTH=307 BGCOLOR="#e6e6e6" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <H2 LANG="en-US" CLASS="western" ALIGN=LEFT>
   <div id ="smallbox">
<div id = "status">
  <div class="status"> 
    <%= f.label :status %> : 

    <%#= f.select :status, [['Active'],['Completed']], {:include_blank => true} %>
    <%= f.select :status, [['Active'],['Completed']] %>
  </div></div> 

</H2>
                </TD>
            </TR>
            <TR>

                <TD COLSPAN=5 WIDTH=618 HEIGHT=13 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><B>

<div class="client">
<%= label_tag :new_client, "Client" %><br/>
<%= text_field_tag :new_client, nil,:maxlength => 30 %>
Or
<%= f.select( :client, Project.all.map {|p| [p.client]}.uniq, :prompt => "Select a previous Client") %>
</div>


</B>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western"><BR>
                    </P>
                </TD>
            </TR>
            <TR>
                <TD COLSPAN=2 WIDTH=307 HEIGHT=13 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><B>
   <div class="business_div">
<%= label_tag :new_business_div, "Business Division" %><br/>
<%= text_field_tag :new_business_div, nil,:maxlength => 30%>
Or
<%= f.select( :business_div, Project.all.map {|p| [p.business_div]}.uniq, :prompt => "Select Business Division") %>
</div>
</B>
                    </P>
                    <P LANG="en-US" CLASS="western"><BR>
                    </P>
                </TD>
                <TD COLSPAN=3 WIDTH=307 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><B>
  <div class="project_owner">
<%= label_tag :new_project_owner, "Project Owner" %><br/>
<%= text_field_tag :new_project_owner, nil,:maxlength => 30 %>
Or
<%= f.select( :project_owner, Project.all.map {|p| [p.project_owner]}.uniq, :prompt => "Select a previous Project Owner") %>
</div>  

</B></P>
                    <P LANG="en-US" CLASS="western"><BR>
                    </P>
                </TD>
            </TR>

            <TR>
                <TD WIDTH=283 HEIGHT=13 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">
   <div class="start_date">
    <%= f.label :start_date %> : 
    <%= f.text_field :start_date, :class => 'datepicker', :style => 'width: 80px;' %>
  </div>  

</P>
                </TD>
                <TD COLSPAN=2 WIDTH=176 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">
Entry Created by:<br> <%= @project.first_name %> <%= @project.last_name %>
  <%= f.hidden_field :first_name, :value => @project.first_name %>
<%= f.hidden_field :last_name, :value => @project.last_name %>
</P>
                </TD>
                <TD COLSPAN=2 WIDTH=151 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">
   Entry date: <br>  <%= l DateTime.now.to_date %>

</P>
                </TD>
            </TR>
            <TR>
                <TD WIDTH=283 HEIGHT=13 VALIGN=TOP BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">
   <div class="end_date">
    <%= f.label :end_date %> :
    <%= f.text_field :end_date, :class => 'datepicker', :style => 'width: 80px;' %>
  </div>  

</P>
                </TD>
                <TD COLSPAN=2 WIDTH=176 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">


Last Edited by: <br> <%= @project.edited_first_name %> <%= @project.edited_last_name %></P>

  <%= f.hidden_field :edited_first_name, :value => current_user.firstname %>
<%= f.hidden_field :edited_last_name, :value => current_user.lastname %>


                </TD>
                <TD COLSPAN=2 WIDTH=151 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">
   Edited date:  <br> 

<% if !(@project.edited_date.blank?) %>


  <%= l @project.edited_date %>

<% end %>
 <%= f.hidden_field :edited_date, :value => DateTime.now.to_date %>
</P>
                </TD>
            </TR>
            <TR>
                <TD WIDTH=283 HEIGHT=13 VALIGN=TOP BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in">


<div class="tech">
<%= label_tag :new_tech, "Technologies Used :" %><br/>
<%= text_field_tag :new_tech, nil,:maxlength => 30 %>
Or
<%= f.select( :tech, Project.all.map {|p| [p.tech]}.uniq, :prompt => "Select a previous Technology") %>
</div>  

</P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western"><BR>
                    </P>
                </TD>
                <TD COLSPAN=2 WIDTH=176 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in">
   <div class="role">
<%= label_tag :new_role, "Role" %><br/>
<%= text_field_tag :new_role, nil,:maxlength => 30%>
Or
<%= f.select( :role, Project.all.map {|p| [p.role]}.uniq, :prompt => "Select a previous role") %>
</div>  

</P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western"><BR>
                    </P>
                </TD>
                <TD COLSPAN=2 WIDTH=151 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in">
   <div class="industry">
<%= label_tag :new_industry, "Industry:" %><br/>
<%= text_field_tag :new_industry, nil,:maxlength => 30%>
Or
<%= f.select( :industry, Project.all.map {|p| [p.industry]}.uniq, :prompt => "Select an industry") %>
</div>  

</P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
                    <P LANG="en-US" CLASS="western"><BR>
                    </P>
                </TD>
            </TR>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=15 BGCOLOR="#e6e6e6" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <H2 LANG="en-US" CLASS="western">
   Summary Of Assignment:  

</H2>
                </TD>
            </TR>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=13 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">

                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>
<div class="summary">
    <%= f.label :summary %><br />
    <%= f.text_area :summary, :style => 'width: 500px;' 'height: 100px;' %>
  </div>

                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>


                </TD>
            </TR>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=15 BGCOLOR="#e6e6e6" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <H2 LANG="en-US" CLASS="western">Additional Informaton</H2>
                </TD>
            </TR>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=13 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">


                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in">
   <div class="lessons_learned">
    <%= f.label :lessons_learned %><br />
    <%= f.text_area :lessons_learned, :style => 'width: 500px;' 'height: 100px;' %>
  </div>  

</P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>

                </TD>
            </TR>
            <TR VALIGN=TOP>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=67 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western">
   <div class="customer_benifits">
    <%= f.label :customer_benifits %><br />
    <%= f.text_area :customer_benifits,:style => 'width: 500px;' 'height: 100px;' %>
  </div>  

</P>
                </TD>

            </TR>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=13 BGCOLOR="#ffffff" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in">
   <div class="financials">
    <%= label_tag :financials, "Financial Responsibility:" %><br />
    <%= f.select :financials, [['£0 - £99,999'],['£100,000 - £249,999'],['£250,000 - £499,999 '],['£500,000 - £999,999 '],['£1,000,000 +']], :prompt => "Select" %>
  </div>
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>

<div class="keywords">
    Any other searchable keywords and tags?<br />
    <%= f.text_field :keywords %>
  </div>

</P>
                    <P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
                    </P>

                </TD>
            </TR>
            <TR>
                <TD COLSPAN=5 WIDTH=618 HEIGHT=14 BGCOLOR="#e6e6e6" STYLE="border: 1px solid #00000a; padding: 0.02in 0.06in">
                    <H2 LANG="en-US" CLASS="western"><A NAME="_GoBack"></A></H2>
                </TD>
            </TR>
        </TBODY>
    </TABLE>
</CENTER>
<P LANG="en-US" CLASS="western" STYLE="margin-bottom: 0in"><BR>
</P>
</BODY>
</HTML>


<div class="create_button">
<div class="actions">
    <%= f.submit "Save Edit", :class => "button", :confirm => "Are you sure you want to save the edit?" %>
  </div>
</div>

</div> <%#= small div %>

<% end %>

<%#= button_to 'Show', @project, :class => "button" %> 

<%#= button_to "Back", projects_path , :class => "button", :method => "get" %>

2 个答案:

答案 0 :(得分:2)

我在你的更新方法中解决问题。 您更改params[attribute],然后使用params['project']

更新项目

因此您需要更改params['project'][attribute]

顺便说一句,您必须阅读有关虚拟属性的内容,您可以使用它们以更清晰的方式执行此操作。

例如

class Project < Activerecord::Base
#your code here

attr_accessor :new_client

before_save :assign_new_client

def assign_new_client
  if @new_client
       self.client = @new_client
       @new_client = nil 
  end
end

end

它没有经过测试,只是展示了如何使用它的想法

答案 1 :(得分:0)

看起来你没有从文本字段中获取值。你需要添加f。在text_field标识符之前。

f.text_field_tag