【问题标题】:How to pass hidden field of user_id to comment?如何将 user_id 的隐藏字段传递给评论?
【发布时间】:2015-03-03 17:06:44
【问题描述】:

我正在尝试在comments/_form 中添加一个隐藏字段,以便用户名显示在 cmets 部分。我所做的一切都不起作用。我真的很想使用隐藏字段,所以我知道如何使它工作。

User 有很多 cmets,而 cmets 属于 user。

这是我目前在comments/_form中拥有的:

  <%= form_for([@place, @place.comments.build]) do |f| %>
     <%= hidden_field :user_id, :value => @user.id %>
  <p>
     <%= f.label :body %><br>
     <%= f.text_field :body %>
  </p>
  <p>
     <%= f.submit %>
  </p>
  <% end %>

这是我目前在_comment.html.erb 中的内容,请注意comment.user.first_name

这是我得到的错误 undefined methodfirst_name' for nil:NilClass`:

 <p>
   <strong>Comment:</strong><br />
    <%= comment.user.first_name %> wrote:<br /><br>
    <%= comment.body %>
</p> 

<p>
  <%= link_to 'Destroy Comment', [comment.place, comment],
           method: :delete,
           data: { confirm: 'Are you sure?' } %>
 </p>

这就是我在comments_controller 中的内容

 class CommentsController < ApplicationController

   def create
     @place = Place.find(params[:place_id])
     @comment = @place.comments.create(comment_params)
     redirect_to place_path(@place)
   end

  def destroy
    @place = Place.find(params[:place_id])
    @comment = @place.comments.find(params[:id])
    @comment.destroy
   redirect_to place_path(@place)
 end

 private
   def comment_params
      params.require(:comment).permit(:body, :user_id)
   end
 end

这是我在ApplicationController 里的:

   helper_method :current_user 

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

有人有什么建议吗?

编辑如果有帮助,我将添加更多内容以供启发。

用户控制器

 class UsersController < ApplicationController
   def new
      @user = User.new
    end

   def create 
    @user = User.new(user_params)
      if @user.save 
      redirect_to root_url, :notice => "Signed Up!"
    else
      render "new"
    end
  end

 end

 private
   def user_params
      params.require(:user).permit(:email, :password, :password_confirmation)
   end

会话控制器

  class SessionsController < ApplicationController
   def new
    end

   def create
      user = User.authenticate(params[:email], params[:password])
      if user
        session[:user_id] = user.id
        redirect_to places_path, :notice => "Logged in!"
      else
        flash.now.alert = "Invalid email or password"
       render "new"
      end
   end

   def destroy 
      session[:user_id] = nil
      redirect_to root_url, :notice => "Logged out!"
    end

  end

地方控制器

 class PlacesController < ApplicationController

  def index 
     @places = Place.all 
   end 


  def new
    @place = Place.new
  end

  def create
    @place = Place.new(place_params)

    if @place.save 
       redirect_to @place
   else 
    render 'new'
  end
 end

 def show
   @place = Place.find(params[:id])
 end

def edit 
   @place = Place.find(params[:id])
 end 

 def update
   @place = Place.find(params[:id])
   if @article.update(place_params)
     redirect_to @place 
   else
     render 'edit'
  end
 end 

 def destroy 
   @place = Place.find(params[:id])
   @place.destroy 

   redirect_to places_path 
 end


end

 private 
  def place_params
    params.require(:place).permit(:name, :location)
  end

【问题讨论】:

    标签: ruby-on-rails ruby hidden-field


    【解决方案1】:

    无需通过 hidden_​​field 发送它,而是将其删除。

    重写你的create方法如下:

    def create
      @place = Place.find(params[:place_id])
      @comment = @place.comments.create(comment_params)
      @comment.user = current_user
      if @comment.save
        redirect_to place_path(@place)
      else
        render "comments/_form"
      end
    end
    

    希望对你有帮助。

    【讨论】:

    • 嗨@Rajesh Omanakuttan,感谢您抽出宝贵时间回复。我已经实现了您在回答中的建议,即删除隐藏字段并添加您在上面的创建方法中建议的内容。其他一切都完好无损。我仍然收到错误消息。要么名称为空,但至少显示帖子和评论,要么我得到这个undefined method first_name' for nil:NilClass`。任何想法为什么会发生这种情况?
    • 奇怪的事情,我刚刚在_comment.html.erb 中尝试了&lt;%= comment.user.email %&gt;,它在一些帖子中显示了电子邮件地址,或者这个错误undefined method email' for nil:NilClass`。但关键是它显示了电子邮件地址!为什么它这样做而不是名字?哦,对不起,只是为了澄清,这是上面评论中所述的修改后的代码。
    • 我认为是@comment 而不是comment
    【解决方案2】:

    注意:这不是最初问题的答案,这是对错误的修复(但它对于评论来说太大了)

    错误是因为current_user 返回nil,根据您的要求有两个选项,

    1)

    CommentsController < ApplicationController
      before_filter :current_user
      ...
    end
    

    2)

    ApplicationController < ActionController::Base
       before_filter :current_user
       .....
    end 
    

    ----更新方法

       def current_user 
         if session[:user_id] 
           @current_user ||= User.find(session[:user_id]) if session[:user_id]
         else
           #redirect user to login to set the session[:user_id] variable
         end 
        end 
    

    【讨论】:

    • 没有骰子。两者都试过。对于 nil:NilClass`,仍然出现此错误 undefined method user'。除了初始答案建议的更改外,其他所有内容都完好无损。如果有帮助,请更新我的帖子。感谢您提供帮助。
    • 哎呀,我的评论中缺少一件事,如果您没有 session[:user_id] ,那么您应该将用户重定向到登录,(更新了我的答案..)
    • 我有sessions[:user_id]。请查看我的会话控制器。如果我理解您的 sessions[:user_id] 评论的含义,我不会尝试仅在登录时显示 first_name,而是在注销时显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2014-08-14
    • 2016-01-31
    • 2015-09-12
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多