为什么在通过表单中的参数传递值时会得到nil?

时间:2013-08-17 17:27:23

标签: ruby-on-rails ruby

<% if current_user.blank? %>
<%tripowner=User.find_by_id(@trip.userid).id%>
<%=tripowner%>
  <h3 class="text-center">Please sign up to provide recommendations.</h3>
    <%= form_tag usersback_url, class: "form-signin", method: 'post' do %>
    <h2 class="form-signin-heading">SIGN UP</h2>
    <div>
      <%= text_field_tag :first_name, nil, class: "input-block-level", placeholder: "First" %>
    </div>
    <div>
      <%= text_field_tag :last_name, nil, class: "input-block-level", placeholder: "Last"  %>
    </div>
    <div>
      <%= email_field_tag :email, nil, class: "input-block-level", placeholder: "Email address"  %>
    </div>
    <div>
      <%= password_field_tag :password, nil, class: "input-block-level", placeholder: "Password"  %>
    </div>
    <div>
      <%= password_field_tag :password_confirmation, nil, class: "input-block-level", placeholder: "Confirm Password"  %>
    </div>
      <%= hidden_field_tag :tripowner, value: tripowner %>
    <div>
      <%= submit_tag "SIGN UP", :class => 'btn btn-large btn-success' %>
    </div>
  <% end %>

<%end%>

:tripowner没有正确地通过params,但是返回nil。我试图在行动中用它来做这件事。我已经确认tripowner收益率为1.因此,我希望@friendship.f2为1.是否有理由将其返回为零?

def createback

@user = User.new
@user.first_name = params[:first_name]
@user.last_name = params[:last_name]
@user.email = params[:email]
@user.password = params[:password]
@user.password_confirmation = params[:password_confirmation]

@friendship = Friend.new
@friendship.f2 = params[:tripowner]
if @user.save

@friendship.f1 = @user.id
@friendship.confirmed = true
@friendship.save

reset_session
session[:user_id] = @user.id

redirect_to :back, notice: "Signed up successfully."

else
  render 'new'
end

朋友模特

class Friend < ActiveRecord::Base
belongs_to :user
end

参数:参数:{“utf8”=&gt;“✓”,“authenticity_token”=&gt;“BkVY0 / z0KeCQRg83wvumUKEmT67R4liMZr33u98mTBE =”,“first_name”=&gt;“rki”,“last_name”=&gt;“rki” ,“email”=&gt;“test @ k”,“password”=&gt;“[FILTERED]”,“password_confirmation”=&gt;“[FILTERED]”,“tripowner”=&gt;“{:value =&gt; 1}“,”“提交”=&gt;“注册”}

正如您所看到的,1正在三重奏中正确传递。

2 个答案:

答案 0 :(得分:0)

试试这个:

<%= hidden_field_tag :tripowner, value: tripowner %>

我认为你应该使用tripowner_id而不是tripowner来跟踪Rails的约定,所以它可以是这样的:

<%= hidden_field_tag :tripowner, value: User.find_by_id(@trip.userid).id %>

答案 1 :(得分:0)

您应该设置关联,以便您可以通过关联访问旅行所有者,而不必为其运行单独的查询。

在这种情况下,旅行应属于用户,并且用户应该有多次旅行......

   Trip.rb  # model
   belongs_to :user

   User.rb  # model
   has_many :trips

有了这个,您可以通过以下方式访问旅行老板:

   @trip.user.id 

假设您在@trip上进行操作,您甚至不需要通过隐藏字段传递任何内容。否则指定类似的东西应该有效:

  <%= hidden_field_tag :tripowner, @trip.user.id %>

==更新

使用您发布的新代码,您应该使用form_for @user ...这将使用user:{attributes}正确命名表单中的所有属性。有了这个而不是单独分配您的模型属性,您可以在控制器操作中执行以下操作:

  @user = User.new(params[:user])

如果您深入了解日志并粘贴发送到控制器操作的params散列,也会有所帮助。如果你在本地运行它,它将在log / development.log中。

==第二次更新

首先检查以确保发送到控制器的params散列看起来是正确的。如果是这样,它可能是您的友谊模型的问题。

hidden_​​field_tag上的文档: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-hidden_field_tag