Rails通过Controller传递隐藏的表单数据

时间:2014-08-31 16:40:11

标签: ruby-on-rails forms

更新:似乎错误可能是由于设计冲突造成的。我使用了另一个应用程序中的一些内容,这些内容显然使得设计变得坚果而且无法读取用户会话。我将从一个干净的安装开始,看看我是否有更好的运气。谢谢!

我正在创建一个只有一个问题的页面。在那个页面上,我有一个人们可以回答这个问题的表格。表单本身只有一个答案块和一个提交按钮。但是,我想将它与提交表单的用户和答案所链接的问题联系起来。为了安全起见,我想在控制器中执行此操作,而不是视图。答案表格显示在问题#index页面上。我目前收到以下错误:

undefined method `user' for #<AnswersController:0x007fe618e5cc10>

我怀疑如果它超过了用户,我会得到同样的问题&#39;

问题#index看起来像这样:

<div class="home_question">
    <h1><%= @daily.question %></h1>

    <div class="answer_form">
        <%= form_for @answer do |answer| %>
            <%= answer.label :answer, "What do you think?" %>
            <%= answer.text_area :answer %>

            <%= answer.button %>
        <% end %>

    </div>
</div>

问题控制器如下所示:

def index
    @daily = Question.find_by(show_month: Time.now.month, show_day: Time.now.day)
    @answer = Answer.new
end

答案控制器如下所示:

def index
  @answers = Answer.all
  @answer = Answer.new
end

def new
  @answer = Answer.new
end

def create
  @answer = Answer.new(answer_params)
  @user = user(params[:id])
  @question = question(params[:id])

  if @answer.save
    redirect_to root
  else
    render 'new'
  end
end

private

def answer_params
  params.require(:answer).permit(:answer, :users_id, :questions_id)
end

表单当前传递的数据是:

{"utf8"=>"✓",
 "authenticity_token"=>"mA16+dg7+Edzxvu/FVWR5r8PZ9zdNaOyvOwSz1VpOXU=",
 "answer"=>{"answer"=>"test"},
 "button"=>""}

1 个答案:

答案 0 :(得分:2)

您得到的错误是因为在控制器中您正在使用未定义的user变量。您想使用大写模型名称User

获取用户ID

如果这是登录用户,那么您可以通过查看会话来获取其ID。通常Rails应用程序将有一个这样的帮助器:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

如果你正在使用设计,你不需要这个助手 - 它已经为你完成了。

获取问题ID

首先确保您的关联资源是嵌套的。所以在我们的routes.rb文件中:

resources :questions do
  resources :answers
end

这意味着要创建答案,我们需要POST /questions/:id/answers

表单更改为:

<%= form_for [@daily, @answer] do |answer| %>
  <%= answer.label :answer, "What do you think?" %>
  <%= answer.text_area :answer %>
  <%= answer.button %>
<% end %>

并在控制器中:

def create
  @answer = Answer.new(answer_params)
  @answer.user = current_user
  @answer.question = Question.find(params[:id])

  if @answer.save
    redirect_to root
  else
    render 'new'
  end
end